首先,我在VB 2012工作。
我在搜索数据库时遇到问题。它变得如此缓慢,实际填充ListView
是困扰我的
我有一个带TextChange事件的文本框。它的即时搜索。因此,当我开始在该文本框中编写时,它开始过滤数据库并填充ListView
中的数据。
这是text box
和Load
程序
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
所以,每次我打一个字母都会调用加载程序。
我有这么多数据而且它太慢了。你能以某种方式帮助我吗?有没有解决方案?
答案 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%的时间内加快速度,那么用户就不会对这个想法犹豫不决。
......那些只是我的头脑。