2013-07-17 5 views
0

Я работаю над рефакторингом приложения формы Windows, которое настраивает временные удары в файле .mdb. Программа делает некоторые округления вверх/вниз по ударам на основе таких факторов, как их близость к обеду, перерывы, конец рабочего дня и т. Д., А также расчет заработной платы на основе требований сверхурочных. Он также используется в качестве графического интерфейса для поиска конкретных записей времени и вручную исправляет плохие удары (неправильный идентификатор клиента, номер задачи и т. Д.). Ничего сложного. Приложение было первоначально написано в 2004 году с использованием ADO.Net. Он отлично работает на компьютерах XP в офисе, но он немедленно срабатывает при работе под управлением Windows 7, поэтому я начал реорганизовывать его. Я декомпилировал его с помощью .Net Reflector и сделал проект aC#, над которым я работал в Visual Studio Express 2012. Были пара синтаксических ошибок, которые я должен был исправить, прежде чем перекомпилировать, но после этого у меня было приложение, полностью работает на Windows 7 (я провел приличное количество тестов против оригинального приложения, и я уверен, что перекомпилированная версия правильно выполняет настройки). Я не мог сказать вам, почему именно он работал с такими небольшими изменениями, но там у вас есть (я бы тоже не подумал об этом, но это не мой главный вопрос). Проблема, с которой я сталкиваюсь, заключается в том, что расчет, который занимает около 1 минуты на динозавре, работающем под управлением XP, занимает около 20 минут на рабочем столе с новой версией Windows 7. Этот конкретный расчет включает автоматическую обработку необработанных записей (которые отмечены булевым полем в таблице), когда приложение запускается. Таблица, из которой поступают записи, имеет ~ 235000 записей, из которых ~ 250 отмечены как необработанные. Уменьшение количества необработанных записей до пяти сокращает время до ~ 10 минут, а сокращение количества записей до нескольких тысяч заставляет программу работать почти мгновенно; однако на данный момент это не вариант. Запуск приложения в режиме отладки, дайте мне проследить проблему к этому методу:Приложение OleDb, выполняющее медленно в Windows 7

[HelpKeyword("vs.data.TableAdapter"), DebuggerNonUserCode, DataObjectMethod(DataObjectMethodType.Select, false)] 
    public virtual dsHours.workDataTable GetDataByWeek(string EmployeeID, DateTime? Date_Entered, DateTime? Date_Entered1) 
    { 
     this.Adapter.SelectCommand = this.CommandCollection[1]; 
     if (EmployeeID == null) 
     { 
      this.Adapter.SelectCommand.Parameters[0].Value = DBNull.Value; 
     } 
     else 
     { 
      this.Adapter.SelectCommand.Parameters[0].Value = EmployeeID; 
     } 
     if (Date_Entered.HasValue) 
     { 
      this.Adapter.SelectCommand.Parameters[1].Value = Date_Entered.Value; 
     } 
     else 
     { 
      this.Adapter.SelectCommand.Parameters[1].Value = DBNull.Value; 
     } 
     if (Date_Entered1.HasValue) 
     { 
      this.Adapter.SelectCommand.Parameters[2].Value = Date_Entered1.Value; 
     } 
     else 
     { 
      this.Adapter.SelectCommand.Parameters[2].Value = DBNull.Value; 
     } 
     dsHours.workDataTable dataTable = new dsHours.workDataTable(); 
     this.Adapter.Fill(dataTable); 
     return dataTable; 
    } 

WorkDataTable класс просто класс, который расширяет System.Data.DataTable и реализует System.Collections.IEnumerable, и добавляет определенное форматирование для рабочий стол в конце .mdb. Если бы кто-нибудь мог указать мне в правильном направлении, выясняя, почему этот код работает так медленно, я бы очень признателен. И, конечно, если вам нужно больше кода/информации, я буду готов его предоставить.

ответ

0

Не существует фундаментальной проблемы с этим методом. Вероятно, проблема заключается в том, сколько раз она вызывается во время обработки. Попытайтесь перегруппировать свой sql, чтобы вытащить все ваши данные одновременно, вверх, а затем обрабатывать все ваши данные в памяти. С LINQ, это должно быть просто сделать эти изменения. Переход от MS Access к чему-то вроде SQL Server Express тоже не повредит.

+0

Спасибо. Кажется, что метод вызывается слишком часто, поэтому я работаю над его изменением. Тем не менее, программа работает достаточно хорошо на XP, есть ли у вас какие-либо идеи, почему она намного медленнее на 7? – mrkicee

+0

Это может быть версия драйверов Jet OleDb. –

+0

В этом ключе я попытался установить Microsoft Access Database Engine 2010 и использовать его в качестве поставщика подключения. Все работает быстро, так что спасибо за подсказку! – mrkicee