2012-05-19 3 views
1

После долгих поисков, пытаясь найти лучшее решение для использования встроенной базы данных в моем приложении WPF, я, наконец, остановился на/обнаружил легкость использования MS Access DB. Я играл с SQL, но в основном продолжал сталкиваться с ошибками и проблемами, которые Access в конечном итоге решал. Поэтому, чтобы использовать DB после импорта, я просто перетащил DataSet в окно WPF, а VS создал кучу кода, который разрешил доступ. Он работает красиво.MS Access DB время поиска/производительность

Существует только одна проблема: при поиске таблицы ZipCode программа останавливается на 4-5 секунд, включая зависание между нажатиями клавиш. Это требует некоторой простоты использования, и я хотел бы найти способ ускорить это.

Я думал об использовании BackgroundWorker, но я не могу понять, как передать ему команды только в соответствующие моменты времени. Я даже не уверен, что это лучшее решение, или если есть другой способ увеличить скорость.

В файле DB zipcodes функционирует как основной ключ, и у меня есть оба столбца (индекс zipcode &), также это не улучшило производительность. Доступ к двум приведенным ниже функциям осуществляется через событие 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 

ответ

1

В играя с этим я действительно нашел ответ на мой собственный, на самом деле очень простое исправление, которое я должен был заметить сразу. Когда я скопировал код, генерируемый VS, я скопировал все это в методы Locate, которые были вызваны событиями OnTextChanged, в результате чего каждый экземпляр каждого DB каждый времени, когда символ был введен в текстовое поле. Излишне говорить, что это была огромная утечка памяти.

Чтобы исправить это, я просто переехал заявление для DataSet переменных в уровень класса главного окна, и создал новый InitializeDB() метода вызывается из MainWindow().

Оставив это здесь (и отвечая на него) на всякий случай, если кто-то еще совершит такую ​​нелепую ошибку в будущем.

Смежные вопросы