【问题标题】:Showing multiple rows of DataReader in single MessageBox在单个 MessageBox 中显示多行 DataReader
【发布时间】:2018-01-23 14:15:17
【问题描述】:

我想在 MessageBox 中显示 Access 数据库中的数据,但我只找到了一种显示单行的方法。我想在所有行的列中显示数据。这是我正在使用的代码:

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       Dim dr As OleDbDataReader
       Try
           con.Open()
           str = "SELECT CUSTOMER.CustName,RECEIPT.ReceiptDate, CUSTOMER_ORDER.DateExpired  FROM ((CUSTOMER INNER JOIN RECEIPT ON CUSTOMER.CustID = RECEIPT.CustID) INNER JOIN CUSTOMER_ORDER ON CUSTOMER_ORDER.ReceiptID = RECEIPT.ReceiptID) INNER JOIN PRODUCT ON PRODUCT.ProdID = CUSTOMER_ORDER.ProdID WHERE YEAR (DateExpired) = 2015"
           Using command As New OleDbCommand(str, con)
               dr = command.ExecuteReader

               If dr.HasRows Then
                   dr.Read()
                   sname = dr.Item("CustName")
                   sdate = dr.Item("ReceiptDate")
                   expdate = dr.Item("DateExpired")
                   dr.Close()
               End If

           End Using

           con.Close()
       Catch ex As Exception
           MsgBox(ex.Message)
       End Try

       'con.Open()
       MessageBox.Show("Customer" & vbTab & vbTab & "DateReceipt" & vbTab & "Expired" & vbNewLine & "**********************************************************" & vbNewLine & sname & vbTab & sdate & vbTab & vbTab & expdate, "Reminder!", MessageBoxButtons.OK)
       con.Close()

   End Sub

【问题讨论】:

    标签: vb.net ado.net


    【解决方案1】:

    如果我理解正确,您有一个DbReader,并且您想显示一个包含多行字符串的消息框。

    Dim msg=""
    Try
        con.Open()
        str = "SELECT CUSTOMER.CustName, RECEIPT.ReceiptDate, CUSTOMER_ORDER.DateExpired " & _
              "FROM ((CUSTOMER INNER JOIN RECEIPT ON CUSTOMER.CustID = RECEIPT.CustID) INNER JOIN CUSTOMER_ORDER ON CUSTOMER_ORDER.ReceiptID = RECEIPT.ReceiptID) INNER JOIN PRODUCT ON PRODUCT.ProdID = CUSTOMER_ORDER.ProdID " & _
              "WHERE YEAR (DateExpired) = 2015"
        Using command = con.CreateCommand(str), dr = command.ExecuteReader
            msg = String.Join(vbCrLf, dr.Cast(Of DbDataRecord).Select(Function(row)
                Return $"{row("CustName")} #{row("ReceiptDate")}#"
            End Function))
        End Using
        con.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    MsgBox(msg)
    

    NB 在我的项目中,我通常会添加一个Joined 扩展方法,它是String.Join 的包装器:

    <Extension> Function Joined(Of T)(source As IEnumerable(Of T), Optional delimiter As String = ",", Optional selector As Func(Of T, String) = Nothing) As String
        If source Is Nothing Then Return ""
        If selector Is Nothing Then Return String.Join(delimiter, source)
        Return String.Join(delimiter, source.Select(selector))
    End Function
    

    那么创建消息的代码就变成了:

    msg = dr.Cast(Of DbDataRecord).Joined(vbCrLf, Function(row) $"{row("CustName")} #{row("ReceiptDate")}#")
    

    【讨论】:

    • 我对代码做了一些改动。但总体而言,您的代码工作正常。谢谢!!
    • @Luqman305 我已将此答案更新为使用interpolated strings
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多