检测 OleDB COUNT 查询的数据是否存在

Detecting if data exists for OleDB COUNT query

我正在尝试从 ACCESS 数据库中提取数据。

事实上,代码有效,没有给出错误... 但是,如果记录不存在,我似乎无法显示消息框。它只是 returns 一个空字符串。

        Using dbCon = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source = '" & Application.StartupPath & "\Res\T500G.accdb'")

        dbCon.Open()

        Dim Query1 As String = "SELECT SUM(Total) FROM [T500] WHERE Pro=@Pro"

        Dim cmd1 As OleDb.OleDbCommand = New OleDbCommand(Query1, dbCon)
        cmd1.Parameters.AddWithValue("@Pro", ComboBoxBP.SelectedItem.ToString)

        Dim reader As OleDb.OleDbDataReader
        reader = cmd1.ExecuteReader


        While reader.Read()

            TextBox1.Text = reader.GetValue(0).ToString

        End While

        reader.Close()
        dbCon.Close()

    End Using

我试过使用 If reader.hasrows then 在文本框中显示结果,否则显示消息框等,但它不起作用。

        If reader.HasRows Then
            While reader.Read()

                TextBox1.Text = reader.GetValue(0).ToString

            End While
        Else

            MessageBox.Show("asd")

        End If

如果我从 reader.GetValue(0) 中删除 .ToString,如果从组合框中选择的项目在数据库中不存在,我会收到错误消息。无法将 DBNull 转换为整数或其他内容。

所以我的问题是,如果记录“@Pro”不存在,如何显示消息框?

谢谢~

已修复(解决方法)

Dim ValueReturned As String
        While reader.Read()

            ValueReturned = reader.GetValue(0).ToString

            If ValueReturned = "" Then

                MessageBox.Show("Not Found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

            Else

                MetroTextBox1.Text = ValueReturned

            End If

        End While

您可以将查询更改为(这是针对 SQL-Server):

IF EXISTS (SELECT * FROM [T500] WHERE Pro = @Pro) SELECT SUM(Total) FROM [T500] WHERE Pro = @Pro ELSE SELECT 'Not Found'

并将您的代码更改为:

    Dim ValueReturned As String
    While reader.Read()

        ValueReturned = reader.GetValue(0).ToString

    End While
    If ValueReturned Is Nothing OrElse ValueReturned = "Not Found" Then
        MessageBox.Show("Not Found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Else
        TextBox1.Text = ValueReturned
    End If

使用 OleDbDataReader 对您的查询来说不是最佳选择,因为它永远不会 return 遍历一组记录:

Dim sql = "SELECT SUM(...=@p1"

' rather than sprinkling you connection string all over
' the app, you can make a function returning one
Using conn As OleDbConnection = GetConnection(),
        cmd As New OleDbCommand(sql, GetConnection())
    conn.Open())

    ' ToDo: Check that ComboBoxBP.SelectedItems.Count >0 before this
    cmd.Parameters.AddWithValue("@p1", ComboBoxBP.SelectedItem.ToString)

    ' execute the query, get a result
    Dim total = cmd.ExecuteScalar

    ' if there is no matches, OleDb returns DBNull
    If total Is System.DBNull.Value Then
        ' no matches
        MessageBox.Show("No matching records!"...)
    Else
        MessageBox.Show("The Total is: " & total.ToString()...)
    End If

End Using   ' disposes of the Connection and Command objects

或者,您可以使用 If IsDBNull(total) Then...。如果你愿意,你也可以转换它:

Dim total = cmd.ExecuteScalar.ToString()
' DBNull will convert to an empty string
If String.IsNullOrEmpty(total) Then
    MessageBox.Show("No Soup For You!")
Else
    ...
End If