来自 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
  1. 您正在执行 SQL 两次,一次是在 ExecuteNonQuery 期间,第二次是在 Fill 期间。
  2. 您没有正确使用 IDisposable 对象。
  3. 你return所有栏目。
  4. 如果您有显示控件,请检查它是否会直接接受行(数据集?)属性。请勿复制

更新

您的连接、命令和其他对象实现了一个 IDisposable 接口。所以它们应该放在 using 块中:

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

那么您就不必担心关闭和处置数据库连接了。

更新 2

您的代码存在线程安全问题,同一个连接不能被两个不同的线程共享。曾经。两个连续的 Fill 请求,一个将在另一个完成之前关闭数据库连接。