1

まず、私は 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

そのため、文字をヒットするたびにロード プロシージャが呼び出されます。

そして、私は非常に多くのデータを持っているので、とても遅くなります。どういうわけか私を助けることができますか?解決策はありますか?

4

3 に答える 3

2

どうすればそれをスピードアップできるかわかりません。データベースへの接続とクエリは、特にキーを押す速度や単語を入力する速度と比較すると、オーバーヘッドが大きくなります。入力しているユーザーに深刻な影響を与えずにこれを行う方法はありません。

代わりに私が提案するのは、わざわざ検索を行う前に、入力が完了したことをユーザーが伝えるのを待つことです。高度なオートコンプリートを実行しようとしている場合は、データベースよりもアプリの近くにデータをキャッシュする必要があります。

于 2013-10-03T21:01:39.657 に答える
0

入力されたテキストの長さが 3 文字 (できれば 5 文字) になるまで、クエリの発行を待機することで、オーバーヘッドをかなり削減する 1 つの方法です。「S」で始まるすべての顧客 (またはこれらが何であれ) が、まれに「Sab....」を探している 1 人を除いて、誰かにとって意味のある、または役立つことはほとんどありません。最初のクエリが完了して表示される前に、2 番目と 3 番目の文字を入力する必要があります。

本当に悪いアイデアを悪くしないようにするために、クエリを 1 回発行する方法を検討し (本当に、本当に必要な場合は最初の文字で)、その後のキーストロークでそれらの結果をフィルター処理します。(アラ・アーロンの「データをアプリの近くにキャッシュする」)。

次はSelect *. 表の内容はわかりませんが、本当にすべての列が必要ですか? これはある種の選択リストのように見えますが、選択を行うために必要な情報をユーザーに提供するために本当に 6 つのフィールドが必要ですか? テーブルに 6 列を超える列がある場合は、すぐにリストビューで使用される 6 列にクエリを絞り込みます。彼らが選択したら、戻ってIDなどで必要なものを正確に取得できます.

個人的にはより高速なコントロールを使用したいと思いますが、それは主観的なものです。

すべてのデータベースは、最終的に休止データを取得します。一度だけ買い物をして二度と戻ってこない顧客 (または何でも) は、リストに含まれる必要がありますか? lastorderdate または lastupdateddate の列がどこかにある場合は、クエリを作成して、過去 XX か月間にアクティブな列を選択します (そうでない場合は、データベースが大きくなるにつれて問題が改善されないため、列を追加できるかどうかを確認してください!)。次に、ユーザーが必要に応じて範囲を広げるためのチェックボックス (「すべて表示」など)。残りの 80% の速度が向上する場合、ユーザーはそのアイデアに躊躇することはありません。

...それらは私の頭のてっぺんから外れています。

于 2013-10-03T21:52:54.370 に答える