1

WPFアプリで組み込みDBを使用するための最良の解決策を見つけるために多くの検索を行った後、私はついにMSAccessDBの使いやすさに落ち着きました。私はSQLをいじってみましたが、基本的にはAccessが最終的に解決したエラーや問題に遭遇し続けました。したがって、インポートしたDBを使用するために、DataSetをWPFウィンドウにドラッグするだけで、VSはアクセスを許可するコードのヒープを生成しました。それは美しく動作します。

ただし、問題は1つだけです。それは、ZipCodeテーブルのルックアップにより、キーを押す間のハングを含め、プログラムが4〜5秒間停止することです。これにより、使いやすさがいくらか失われます。これを高速化する方法を見つけたいと思います。

BackgroundWorkerを使用することを考えましたが、適切なタイミングでのみコマンドを渡す方法がわからないようです。これが最善の解決策なのか、それとも速度を上げる別の方法があるのか​​さえわかりません。

DBファイルでは、郵便番号が主キーとして機能し、両方の列(郵便番号と場所)にインデックスが付けられています。これでも、パフォーマンスはそれほど向上していないようです。以下の2つの関数は、さまざまなテキストボックスのOnTextChangedイベントを介してアクセスされます。

任意の提案をいただければ幸いです。

public void LocateZipCode(TextBox source, TextBox destination)
    {
        LocationsDataSet locationsDataSet = ((LocationsDataSet)this.FindResource("locationsDataSet"));

        // Load data into the table ZipCodes. You can modify this code as needed.
        LocationsDataSetTableAdapters.ZipCodesTableAdapter locationsDataSetZipCodesTableAdapter = new LocationsDataSetTableAdapters.ZipCodesTableAdapter();
        locationsDataSetZipCodesTableAdapter.Fill(locationsDataSet.ZipCodes);
        CollectionViewSource zipCodesViewSource = ((CollectionViewSource)(this.FindResource("zipCodesViewSource")));
        zipCodesViewSource.View.MoveCurrentToFirst();

        try
        {
            if (source.Text.Length == 5)
            {
                destination.Text = locationsDataSet.ZipCodes.FindByZipCode(source.Text).Location.ToString();
            }                
        }
        catch (NullReferenceException)
        {

        }
    }

    #region Area Code Lookup
    public void LocateAreaCode(TextBox source, TextBox destination, TextBox destination2 = null)
    {
        LocationsDataSet locationsDataSet = ((LocationsDataSet)(this.FindResource("locationsDataSet")));

        // Load data into the table AreaCodes. You can modify this code as needed.
        LocationsDataSetTableAdapters.AreaCodesTableAdapter locationsDataSetAreaCodesTableAdapter = new LocationsDataSetTableAdapters.AreaCodesTableAdapter();
        locationsDataSetAreaCodesTableAdapter.Fill(locationsDataSet.AreaCodes);
        CollectionViewSource areaCodesViewSource = ((CollectionViewSource)(this.FindResource("areaCodesViewSource")));
        areaCodesViewSource.View.MoveCurrentToFirst();

        try
        {
            if (source.Text.Length >= 3 && destination2 != null)                                        //Info tab area code check
            {
                destination.Text = locationsDataSet.AreaCodes.FindByArea_Code(source.Text).Location.ToString();
                destination2.Text = locationsDataSet.AreaCodes.FindByArea_Code(source.Text).Time_Zone.ToString();
            }
            else if (source.Text.Length >= 3 && destination.Text.Length == 0 && destination2 == null)   //Other area code checks
            {
                destination.Text = locationsDataSet.AreaCodes.FindByArea_Code(source.Text).Location.ToString();
            }
            else if (source.Text.Length < 3 && destination2 != null)                                    //Info tab area code check
            {
                destination.Text = "";
                destination2.Text = "";
            }
            else if (source.Text.Length < 3 && destination.Text.Length == 0 && destination2 == null)    //Other area code checks
            {
                destination.Text = "";
                if (destination2 != null)
                {
                    destination2.Text = "";
                }
            }
        }
        catch (NullReferenceException)
        {
            destination.Text = "Invalid Area Code";
            if (destination2 != null)
            {
                destination2.Text = "";
            }
        }
    }
    #endregion
4

1 に答える 1

1

これをいじってみると、私は実際に自分で答えを見つけました。実際には、すぐに気付くはずの非常に簡単な修正です。VSで生成されたコードをコピーするLocateと、イベントによって呼び出されたメソッドにすべてがコピーされ、テキストボックスに文字が入力されるたびOnTextChangedに各DBの新しいインスタンスが作成されました。言うまでもなく、これは大量のメモリの浪費でした。

これを修正するために、DataSet変数の宣言をメインウィンドウのクラスレベルに移動し、InitializeDB()から呼び出される新しいメソッドを作成しましたMainWindow()

他の誰かが将来そのようなばかげた誤りを犯した場合に備えて、これをここに残して(そしてそれに答えて)ください。

于 2012-05-20T16:06:04.320 に答える