MS 访问数据库搜索时间/性能

本文关键字:性能 时间 搜索 访问 数据库 MS | 更新日期: 2023-09-27 18:34:37

经过大量搜索,试图找到在我的WPF应用程序中使用嵌入式数据库的最佳解决方案,我最终确定/发现了使用MS Access DB的便利性。 我曾经尝试过SQL,但基本上一直遇到错误和问题,Access最终解决了这些错误和问题。 因此,为了在导入后使用数据库,我只需将数据集拖到 WPF 窗口上,VS 就会生成一堆允许访问的代码。 它工作得很好。

但是只有一个问题,那就是ZipCode表查找会导致程序停止4-5秒,包括在按键之间挂起。 这占用了一些易用性,我想找到一种方法来加快速度。

我想过使用后台工作者,但我似乎无法找到一种仅在适当时间将命令传递给它的方法。 我什至不确定这是否是最好的解决方案,或者是否有另一种提高速度的方法。

在数据库文件中,邮政编码用作主键,并且我为两列(邮政编码和位置(编制了索引,这似乎也没有提高性能。 下面的两个函数是通过各种文本框的 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

MS 访问数据库搜索时间/性能

在玩这个的过程中,我实际上自己找到了答案,实际上是一个非常简单的修复,我应该立即注意到。 当我复制 VS 生成的代码时,我将整个内容复制到Locate方法中,这些方法由 OnTextChanged 事件调用,每次在文本框中输入字符时,都会产生每个数据库的新实例。 不用说,这是一个巨大的内存消耗。

为了修复它,我只是将DataSet变量的声明移动到主窗口的类级别,并创建了一个从 MainWindow() 调用的新InitializeDB()方法。

把这个留在这里(并回答它(,以防万一其他人将来犯了如此荒谬的错误。