使用文本框搜索数据库

时间:2013-10-03 20:52:03

标签: sql-server vb.net listview search

首先,我在VB 2012工作。

我在搜索数据库时遇到问题。它变得如此缓慢,实际填充ListView是困扰我的 我有一个带TextChange事件的文本框。它的即时搜索。因此,当我开始在该文本框中编写时,它开始过滤数据库并填充ListView中的数据。

这是text boxLoad程序

中的代码
Private Sub txtID_TextChanged(sender As Object, e As EventArgs) Handles txtID.TextChanged
    Load("SELECT * FROM table WHERE id LIKE '" & txtID.Text & "%'")
End Sub


Private Sub Load(ByVal strQ As String)
    List.Items.Clear()
    cmd = New SqlClient.SqlCommand(strQ, con)
    dr = cmd.ExecuteReader()
    If dr.HasRows = True Then
        While dr.Read
            Dim X As ListViewItem
            X = List.Items.Add(dr(0))
            X.SubItems.Add(dr(2))
            X.SubItems.Add(dr(3))
            X.SubItems.Add(dr(4))
            X.SubItems.Add(dr(1))
            X.SubItems.Add(dr(5))            
        End While
    End If
End Sub

所以,每次我打一个字母都会调用加载程序。

我有这么多数据而且它太慢了。你能以某种方式帮助我吗?有没有解决方案?

3 个答案:

答案 0 :(得分:2)

我不知道你怎么可能加快速度。连接和查询数据库是一个很大的开销,特别是与按键或键入单词的速度相比。如果没有严重影响正在打字的用户,就没有办法做到这一点。

我建议您在等待搜索之前等待用户告诉您他们已完成打字。如果您正在尝试进行花哨的自动完成工作,那么您需要将数据缓存到比应用程序更接近数据库的位置。

答案 1 :(得分:2)

您需要创建一个类来保存搜索结果,如下所示:

Public Class SearchResult
    Private _propID As String
    Public Property ID() As String
        Get
            Return _propID
        End Get
        Set
            _propID = Value
        End Set
    End Property

Private _propName As String
    Public Property PropName() As String
        Get
            Return _propName
        End Get
        Set
            _propName = Value
        End Set
    End Property
    ...
End Class

现在您查询数据库以获取要在列表视图中显示的所有结果,并将其存储在List(Of SearchResult)中,如下所示:

Private Function Load(ByVal strQ As String) As List(Of SearchResult)
    Dim ListOfResults = New List(Of SearchResult)
    cmd = New SqlClient.SqlCommand(strQ, con)
    dr = cmd.ExecuteReader()
    If dr.HasRows = True Then
        While dr.Read
            Dim X As New SearchResult()
            X.PropID = dr(0)
            X.PropName = dr(1)
            ...            
        End While
    End If
End Sub

您可以像这样调用此代码:

Dim AllSearchResults = Load("SELECT * FROM table WHERE id LIKE '" & txtID.Text & "%'")

现在,当您想要进行搜索时,您可以针对所有内容的缓存列表(AllSearchResults)应用以下LINQ,如下所示:

Public Function DoSearch(searchText As String) As List(Of SearchResult)    
    Return From s In AllSearchResults Where s.PropID.Contains(searchText) Select c
End Function

最后,您可以在每次按键时调用此LINQ过滤,如下所示:

Private Sub txtID_TextChanged(sender As Object, e As EventArgs) Handles txtID.TextChanged
    DoSearch(txtID.Text)
End Sub

答案 2 :(得分:0)

将开销降低一定程度以等待发出查询直到输入的文本长度为3(或更好的5)字符的一种方法。所有以“S”开头的客户(或其他任何客户)都非常非常不可能对任何人有意义或有帮助,除了在极少数情况下寻找“Sab ....”的人。人们必须在第一个查询完成并显示之前输入第二个和第三个字符!

为了让一个非常糟糕的主意变得不那么糟糕,我会研究一种方法来发出查询ONCE(如果我真的必须在第一个角色上),然后在随后的击键中过滤掉这些结果。 (ala Aaron的“将数据缓存到应用程序附近”)。

接下来是Select *。我不知道桌子上有什么,但你真的需要每一栏吗?这似乎是某种选择列表,您真的需要6个字段来为用户提供进行选择所需的信息吗?如果表中有超过6列,请立即将查询缩小到列表视图中使用的6。一旦他们做出选择,您就可以返回并通过ID或其他任何方式获得您所需要的。

我个人使用更快的控制,但那是主观的。

所有数据库最终都会获取休眠数据。曾经是一次性购物者且永不返回的顾客(或其他) - 他们是否需要列入清单?如果lastorderdate或lastupdateddate的某个列构造了您的查询以选择在过去XX个月中活动的那些(如果没有,请查看是否可以添加一个,因为随着数据库变大,问题不会变得更好!)。然后是一个复选框,供用户根据需要扩大范围,例如“查看全部”或其他内容。如果用户在80%的时间内加快速度,那么用户就不会对这个想法犹豫不决。

......那些只是我的头脑。