检测 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
我正在尝试从 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