Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MS Access数据库搜索次数/性能_C#_Wpf_Database_Ms Access_Backgroundworker - Fatal编程技术网

C# MS Access数据库搜索次数/性能

C# MS Access数据库搜索次数/性能,c#,wpf,database,ms-access,backgroundworker,C#,Wpf,Database,Ms Access,Backgroundworker,在寻找在我的WPF应用程序中使用嵌入式DB的最佳解决方案后,我终于找到了使用MS Access DB的简易性。我曾经使用过SQL,但基本上一直遇到Access最终解决的错误和问题。因此,为了在导入后使用DB,我只需将数据集拖到WPF窗口,VS生成一堆允许访问的代码。它工作得很好 不过,只有一个问题,即ZipCode表查找会导致程序暂停4-5秒,包括在按键之间挂起。这就失去了一些易用性,我想找到一种方法来加速这一过程 我曾想过使用BackgroundWorker,但似乎无法找到在适当的时间将命令传

在寻找在我的WPF应用程序中使用嵌入式DB的最佳解决方案后,我终于找到了使用MS Access DB的简易性。我曾经使用过SQL,但基本上一直遇到Access最终解决的错误和问题。因此,为了在导入后使用DB,我只需将数据集拖到WPF窗口,VS生成一堆允许访问的代码。它工作得很好

不过,只有一个问题,即ZipCode表查找会导致程序暂停4-5秒,包括在按键之间挂起。这就失去了一些易用性,我想找到一种方法来加速这一过程

我曾想过使用BackgroundWorker,但似乎无法找到在适当的时间将命令传递给它的方法。我甚至不确定这是不是最好的解决方案,或者是否有其他方法来提高速度

在DB文件中,zipcodes充当主键,我对这两列(zipcode和location)都进行了索引,而且这似乎并没有显著提高性能。通过各种文本框的ContextChanged事件可以访问以下两个函数

如有任何建议,将不胜感激

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
public void LocateZipCode(文本框源,文本框目标)
{
LocationsDataSet LocationsDataSet=((LocationsDataSet)this.FindResource(“LocationsDataSet”);
//将数据加载到ZipCodes表中。您可以根据需要修改此代码。
LocationsDataSetTableAdapters.ZipCodesTableAdapter locationsDataSetZipCodesTableAdapter=新位置sDataSettableAdapters.ZipCodesTableAdapter();
locationsDataSetZipCodesTableAdapter.Fill(locationsDataSet.ZipCodes);
CollectionViewSource zipCodesViewSource=((CollectionViewSource)(this.FindResource(“zipCodesViewSource”));
zipCodesViewSource.View.MoveCurrentToFirst();
尝试
{
if(source.Text.Length==5)
{
destination.Text=locationsDataSet.ZipCodes.FindByZipCode(source.Text.Location.ToString();
}                
}
捕获(NullReferenceException)
{
}
}
#区域区号查找
公共无效位置区域代码(文本框源、文本框目标、文本框目标2=null)
{
LocationsDataSet LocationsDataSet=((LocationsDataSet)(this.FindResource(“LocationsDataSet”));
//将数据加载到表AreaCodes中。您可以根据需要修改此代码。
LocationsDataSetTableAdapters.AreaCodeStableApter LocationSDataSetaaCodesTableAdapter=新位置SDataSettableAdapters.AreaCodeStableApter();
位置SDataSetAreacodesTableAdapter.Fill(位置SDataSet.AreaCodes);
CollectionViewSource areaCodesViewSource=((CollectionViewSource)(this.FindResource(“areaCodesViewSource”));
areaCodesViewSource.View.MoveCurrentToFirst();
尝试
{
if(source.Text.Length>=3&&destination2!=null)//信息选项卡区号检查
{
destination.Text=locationsDataSet.AreaCodes.FindByArea_Code(source.Text).Location.ToString();
destination2.Text=locationsDataSet.AreaCodes.FindByArea_代码(source.Text).Time_Zone.ToString();
}
else if(source.Text.Length>=3&&destination.Text.Length==0&&destination2==null)//其他区号检查
{
destination.Text=locationsDataSet.AreaCodes.FindByArea_Code(source.Text).Location.ToString();
}
else if(source.Text.Length<3&&destination2!=null)//信息选项卡区号检查
{
destination.Text=“”;
目的2.Text=“”;
}
else if(source.Text.Length<3&&destination.Text.Length==0&&destination2==null)//其他区号检查
{
destination.Text=“”;
if(destination2!=null)
{
目的2.Text=“”;
}
}
}
捕获(NullReferenceException)
{
destination.Text=“无效区号”;
if(destination2!=null)
{
目的2.Text=“”;
}
}
}
#端区

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

为了解决这个问题,我将
DataSet
变量的声明移动到主窗口的类级别,并创建了一个新的
InitializeDB()
方法,该方法从
MainWindow()调用


把这个放在这里(并回答它),以防将来有人犯这样一个荒谬的错误。

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

为了解决这个问题,我将
DataSet
变量的声明移动到主窗口的类级别,并创建了一个新的
InitializeDB()
方法,该方法从
MainWindow()调用

把这个留在这里(并回答它),以防万一