使用 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
我使用此代码也可以搜索我手动输入的数据:
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