来自 sql table 中 65000 条记录的 AutocompleteExtender
AutocompleteExtender from a 65000 record in sql table
我正在尝试从巨大的 sql table 中自动完成城市名称。我下面的代码可以工作,但它非常慢,有时它会冻结,因为我收到了很多重复的建议。有什么方法可以过滤所有这些重复的字符串以使其更快?谢谢
Public Function GetCompletionList(ByVal prefixText As String, ByVal count As Integer) As String()
Dim strCn As String = "Data Source=sqlserver\sqlexpress;Initial Catalog=zip;User ID=sa;Password=xxx"
cn.ConnectionString = strCn
Dim cmd As New SqlClient.SqlCommand
cmd.Connection = cn
cmd.CommandType = CommandType.Text
cmd.CommandText = "select * from zip_code Where City like @myParameter+'%'"
cmd.Parameters.AddWithValue("@myParameter", prefixText)
Try
cn.Open()
cmd.ExecuteNonQuery()
Dim da As New SqlDataAdapter(cmd)
Dim dt As New DataTable()
da.Fill(ds)
Catch ex As Exception
Finally
cn.Close()
End Try
dt = ds.Tables(0)
Dim txtItems As New List(Of String)()
Dim dbValues As String
For Each row As DataRow In dt.Rows
dbValues = row("City").ToString()
dbValues = dbValues.ToLower()
txtItems.Add(dbValues)
Next
Return txtItems.ToArray
- 您正在执行 SQL 两次,一次是在 ExecuteNonQuery 期间,第二次是在 Fill 期间。
- 您没有正确使用 IDisposable 对象。
- 你return所有栏目。
- 如果您有显示控件,请检查它是否会直接接受行(数据集?)属性。请勿复制
更新
您的连接、命令和其他对象实现了一个 IDisposable 接口。所以它们应该放在 using 块中:
Using { resourcelist | resourceexpression }
[ statements ]
End Using
那么您就不必担心关闭和处置数据库连接了。
更新 2
您的代码存在线程安全问题,同一个连接不能被两个不同的线程共享。曾经。两个连续的 Fill 请求,一个将在另一个完成之前关闭数据库连接。
我正在尝试从巨大的 sql table 中自动完成城市名称。我下面的代码可以工作,但它非常慢,有时它会冻结,因为我收到了很多重复的建议。有什么方法可以过滤所有这些重复的字符串以使其更快?谢谢
Public Function GetCompletionList(ByVal prefixText As String, ByVal count As Integer) As String()
Dim strCn As String = "Data Source=sqlserver\sqlexpress;Initial Catalog=zip;User ID=sa;Password=xxx"
cn.ConnectionString = strCn
Dim cmd As New SqlClient.SqlCommand
cmd.Connection = cn
cmd.CommandType = CommandType.Text
cmd.CommandText = "select * from zip_code Where City like @myParameter+'%'"
cmd.Parameters.AddWithValue("@myParameter", prefixText)
Try
cn.Open()
cmd.ExecuteNonQuery()
Dim da As New SqlDataAdapter(cmd)
Dim dt As New DataTable()
da.Fill(ds)
Catch ex As Exception
Finally
cn.Close()
End Try
dt = ds.Tables(0)
Dim txtItems As New List(Of String)()
Dim dbValues As String
For Each row As DataRow In dt.Rows
dbValues = row("City").ToString()
dbValues = dbValues.ToLower()
txtItems.Add(dbValues)
Next
Return txtItems.ToArray
- 您正在执行 SQL 两次,一次是在 ExecuteNonQuery 期间,第二次是在 Fill 期间。
- 您没有正确使用 IDisposable 对象。
- 你return所有栏目。
- 如果您有显示控件,请检查它是否会直接接受行(数据集?)属性。请勿复制
更新
您的连接、命令和其他对象实现了一个 IDisposable 接口。所以它们应该放在 using 块中:
Using { resourcelist | resourceexpression }
[ statements ]
End Using
那么您就不必担心关闭和处置数据库连接了。
更新 2
您的代码存在线程安全问题,同一个连接不能被两个不同的线程共享。曾经。两个连续的 Fill 请求,一个将在另一个完成之前关闭数据库连接。