经过大量搜索,试图找到在我的WPF应用程序中使用嵌入式数据库的最佳解决方案后,我终于确定/发现了使用MS Access DB的难易程度。我曾经玩过SQL,但基本上一直遇到Access最终解决的错误和问题。因此,为了在导入后使用DB,我只需将DataSet拖到WPF窗口上,VS就会生成一堆允许访问的代码。它工作得很漂亮。
但是只有一个问题,即ZipCode表查找导致程序停顿4-5秒,包括在按键之间挂起。这需要一些易用性,我想找到一种方法来加快速度。
我想过使用BackgroundWorker,但我似乎无法找到一种方法只在适当的时间将命令传递给它。我甚至不确定这是否是最佳解决方案,或者是否有其他方法可以提高速度。
在数据库文件中,zipcodes用作主键,我有两个列(zipcode和amp; location)索引,这似乎也没有提高性能。下面的两个函数是通过各种文本框的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
答案 0 :(得分:1)
在玩这个时,我实际上找到了自己的答案,实际上是一个非常简单的修复,我应该马上注意到。当我复制VS生成的代码时,我将整个内容复制到由Locate
事件调用的OnTextChanged
方法中,从而导致每个数据库 的新实例 在文本框中输入字符的时间。毋庸置疑,这是一次巨大的记忆消耗。
要修复它,我只是将DataSet
变量的声明移动到主窗口的类级别,并创建了一个从InitializeDB()
调用的新MainWindow()
方法。
将此留在这里(并回答它)以防万一其他人在将来犯下如此荒谬的错误。