参数为空时无结果
No results when parameter is null
您好,我想知道是否有人可以帮助我解决我遇到的编码问题。
我有一个表单,用户可以在文本框中输入姓氏,return 来自姓氏匹配的数据库(访问 2013)的结果。这很好用,如果文本框留空,我还想查询 return 数据库中的所有条目。这是我遇到问题的部分,当文本框留空时,没有结果 returned。我在这个网站上搜索了几个问题,到目前为止我所看到的我的代码应该可以工作。有人可以告诉我我的代码哪里不正确吗?
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'creates a list of all employees as per the search parameters
Dim dt As New DataTable
Dim query As String = " select [employeeid] as empolyeeid, (firstname &' '& lastname &' '& dob) as empdetails from employee where ((@lastname is null) or (lastname = @lastname))"
Using connection As New OleDbConnection(My Database Connection)
Using command As New OleDbCommand(query, connection)
Using adapter As New OleDbDataAdapter(command)
command.Parameters.AddWithValue("@lastname", txt_lastname.Text)
connection.Open()
adapter.Fill(dt)
connection.Close()
End Using
End Using
End Using
If dt.Rows.Count > 0 Then
lb_search.DataSource = dt
lb_search.DisplayMember = "employeeid"
lb_search.ValueMember = "empdetails"
End If
End Sub
感谢阅读。非常感谢任何关于为什么这不起作用的见解谢谢
你应该更换
((@lastname is null) or (lastname = @lastname))
有
((@lastname = '') or (lastname = @lastname))
您的文本框可以包含空字符串,但不能包含 null。
为了安全使用txt_lastname.Text.Trim
问题是 TextBox.Text 属性 永远不会为空。
实际上,当您将 TextBox 留空时,您得到的是 Text=String.Empty
,而不是 null.
当然,解决方案是检查空字符串而不是空字符串
Dim query As String = "select [employeeid] as empolyeeid, " & _
"(firstname &' '& lastname &' '& dob) as empdetails " & _
"from employee where ((@lastname = '') or " & _
"(lastname = @lastname))"
但您也可以简化命令文本并将 VB 代码更改为
Dim query As String = "select [employeeid] as empolyeeid, " & _
"(firstname &' '& lastname &' '& dob) as empdetails " & _
"from employee where lastname LIKE @lastname"
command.Parameters.AddWithValue("@lastname",
if(string.IsNullOrWhiteSpace(txt_lastname.Text),
"%", txt_Lastname.Text.Trim())
这样WHERE子句只有一个条件,使用LIKE运算符进行匹配。这样,如果您的文本框为空,您可以传递匹配任何 lastname
的通配符 %
,而如果姓氏有效,您也可以匹配姓氏字段(如果已键入值)使用不同的大小写(lower/upper 不匹配)
您好,我想知道是否有人可以帮助我解决我遇到的编码问题。
我有一个表单,用户可以在文本框中输入姓氏,return 来自姓氏匹配的数据库(访问 2013)的结果。这很好用,如果文本框留空,我还想查询 return 数据库中的所有条目。这是我遇到问题的部分,当文本框留空时,没有结果 returned。我在这个网站上搜索了几个问题,到目前为止我所看到的我的代码应该可以工作。有人可以告诉我我的代码哪里不正确吗?
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'creates a list of all employees as per the search parameters
Dim dt As New DataTable
Dim query As String = " select [employeeid] as empolyeeid, (firstname &' '& lastname &' '& dob) as empdetails from employee where ((@lastname is null) or (lastname = @lastname))"
Using connection As New OleDbConnection(My Database Connection)
Using command As New OleDbCommand(query, connection)
Using adapter As New OleDbDataAdapter(command)
command.Parameters.AddWithValue("@lastname", txt_lastname.Text)
connection.Open()
adapter.Fill(dt)
connection.Close()
End Using
End Using
End Using
If dt.Rows.Count > 0 Then
lb_search.DataSource = dt
lb_search.DisplayMember = "employeeid"
lb_search.ValueMember = "empdetails"
End If
End Sub
感谢阅读。非常感谢任何关于为什么这不起作用的见解谢谢
你应该更换
((@lastname is null) or (lastname = @lastname))
有
((@lastname = '') or (lastname = @lastname))
您的文本框可以包含空字符串,但不能包含 null。
为了安全使用txt_lastname.Text.Trim
问题是 TextBox.Text 属性 永远不会为空。
实际上,当您将 TextBox 留空时,您得到的是 Text=String.Empty
,而不是 null.
当然,解决方案是检查空字符串而不是空字符串
Dim query As String = "select [employeeid] as empolyeeid, " & _
"(firstname &' '& lastname &' '& dob) as empdetails " & _
"from employee where ((@lastname = '') or " & _
"(lastname = @lastname))"
但您也可以简化命令文本并将 VB 代码更改为
Dim query As String = "select [employeeid] as empolyeeid, " & _
"(firstname &' '& lastname &' '& dob) as empdetails " & _
"from employee where lastname LIKE @lastname"
command.Parameters.AddWithValue("@lastname",
if(string.IsNullOrWhiteSpace(txt_lastname.Text),
"%", txt_Lastname.Text.Trim())
这样WHERE子句只有一个条件,使用LIKE运算符进行匹配。这样,如果您的文本框为空,您可以传递匹配任何 lastname
的通配符 %
,而如果姓氏有效,您也可以匹配姓氏字段(如果已键入值)使用不同的大小写(lower/upper 不匹配)