使用 vb.net 搜索 linq 时出现问题

Problem in searching with linq using vb.net

我使用此代码也可以搜索我手动输入的数据:

 Dim Collections = New String() {"Frensh", "Britich", "English"}
 Dim textToSearch As String = dr7.Text.ToLower()
 ListBox1.Visible = False
 If String.IsNullOrEmpty(textToSearch) Then Return
 Dim result As String() = (From i In Collections Where i.Trim().Contains(textToSearch) Select i).ToArray()
 If result.Length = 0 Then Return
 ListBox1.Items.Clear()
 ListBox1.Items.AddRange(result)
 ListBox1.Visible = True 

现在我不想使用数组而是从数据库加载数据,我做了以下代码:

Dim strSql As String = "SELECT distinct t2 FROM add_emp where  t2 like '%" & dr7.Text.Trim & "%'"
        Dim dtb As New DataTable
        If con.State = ConnectionState.Open Then con.Close()
        con.Open()
        Dim dad As New SqlDataAdapter(strSql, con)
        dtb.Clear()
        dad.Fill(dtb)
        dad.Dispose()
        con.Close()
          
        Dim textToSearch As String = dr7.Text.ToLower()
        ListBox1.Visible = False
        If String.IsNullOrEmpty(textToSearch) Then Return

        Dim result As String() = (From i In dtb Where i.Trim().Contains(textToSearch) Select i).ToArray()

        If result.Length = 0 Then Return
        ListBox1.Items.Clear()
        ListBox1.Items.AddRange(result)
        ListBox1.Visible = True

我尝试做的是,我将“collection”作为数组替换为“dtb”作为 DataTable,并且此行出现错误,而且我不知道处理此代码是否也能正常工作:

 Dim result As String() = (From i In dtb Where i.Trim().Contains(textToSearch) Select i).ToArray()

我已将数据访问代码与用户界面代码分开。

Using...End Using 块确保您的数据库对象被关闭并被释放,即使出现错误也是如此。不要在使用它的方法之外声明您的连接。您在上面创建了 DataTable 3 行。为什么需要 Clear 它?如果 DataAdapter 发现连接已关闭,它将打开和关闭连接。否则,它将保持打开状态。

至于linq代码。您想要遍历数据行。 DataTable 没有实现 IEnumerable 但它提供了 return 可枚举 (AsEnumerable) 的扩展方法。 DataTable 的第一列是索引为 0 的 Field(Of String)。

Private dr7 As New TextBox
Private Function GetValuesForListBox(SearchString As String) As String()
    Dim strSql = "SELECT distinct t2 FROM add_emp where  t2 like @dr7;"
    Dim dtb As New DataTable
    Using con As New SqlConnection("Your connection string"),
            dad As New SqlDataAdapter(strSql, con)
        dad.SelectCommand.Parameters.Add("@dr7", SqlDbType.VarChar).Value = $"%{SearchString}%"
        dad.Fill(dtb)
    End Using 'Closes and disposes Connection and disposes DataAdapter

    Dim result = (From row As DataRow In dtb.AsEnumerable
                  Select row.Field(Of String)(0)).ToArray
    Return result
End Function

Private Sub FillListBox()
    If String.IsNullOrWhiteSpace(dr7.Text) Then Return
    Dim Result = GetValuesForListBox(dr7.Text.Trim)
    If Result.Length = 0 Then Return
    ListBox1.Visible = False
    ListBox1.Items.Clear()
    ListBox1.Items.AddRange(Result)
    ListBox1.Visible = True
End Sub