参数为空时无结果

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 不匹配)