2015-08-13 26 views
0

我想在一個MessageBox中顯示來自Access數據庫的數據,但我只找到一種顯示單行的方法。我想在所有行的列中顯示數據。這是我使用的代碼:在單個消息框中顯示多行DataReader

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 

回答

0

如果我理解正確的,你有一個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")}#") 
+0

我改變了一下代碼。但是總的來說你的代碼像我想要的那樣工作。謝謝! – Luqman305

+0

@ Luqman305我已更新此答案以使用[插入的字符串](https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/strings/interpolated-strings) 。 –