Сколько объектов DataTable я должен использовать в своем приложении C #? - PullRequest
2 голосов
/ 18 сентября 2008

Я опытный программист в унаследованном (но пока объектно-ориентированном) инструменте разработки и перехожу на C # /. Net. Я пишу небольшое однопользовательское приложение с использованием SQL Server CE 3.5. Я прочитал концептуальный DataSet и соответствующий документ, и мой код работает.

Теперь я хочу убедиться, что я делаю это «правильно», получить некоторую обратную связь от опытных программистов .Net / SQL Server, чего вы не получите от чтения документа.

Я заметил, что у меня есть такой код в нескольких местах:

var myTableDataTable = new MyDataSet.MyTableDataTable();
myTableTableAdapter.Fill(MyTableDataTable);

... // other code

В однопользовательском приложении вы обычно просто делаете это один раз при запуске приложения, создаете экземпляр объекта DataTable для каждой таблицы и затем сохраняете ссылку на него, чтобы вы когда-либо просто использовали этот единственный объект, который уже заполнен данными? Таким образом, вы будете когда-либо читать данные из БД только один раз, а не несколько раз. Или издержки этого настолько малы, что это просто не имеет значения (плюс может быть контрпродуктивно с большими таблицами)?

Ответы [ 4 ]

3 голосов
/ 18 сентября 2008

Для CE это, вероятно, не проблема. Если вы распространяли это приложение среди тысяч пользователей, и все они использовали централизованную БД, вы можете потратить некоторое время на оптимизацию. В однопользовательской БД, такой как CE, если у вас нет данных, требующих оптимизации, я бы не стал беспокоиться об этом. Преждевременная оптимизация и т. Д.

0 голосов
/ 18 сентября 2008

Легче найти ответ на этот вопрос, когда вы думаете о наборах данных как о «сеансе» данных. Вы заполняете наборы данных; ты работаешь с ними; а затем вы кладете данные обратно или удаляете их, когда закончите. Поэтому вам нужно задавать такие вопросы:

  1. Насколько актуальными должны быть данные? Всегда ли вам нужны самые последние данные или база данных будет меняться не так часто?
  2. Для чего вы используете данные? Если вы просто используете их для отчетов, то вы можете легко заполнить набор данных, запустить отчет, затем выбросить набор данных и в следующий раз просто сделать новенький. В любом случае это даст вам более актуальные данные.
  3. Сколько именно данных мы говорим? Вы сказали, что работаете с относительно небольшим набором данных, поэтому если вы загружаете все это в память и держите его там, это не сильно повлияет на память. навсегда.

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

В этом сценарии главное, о чем вам нужно беспокоиться: что, если приложение выйдет ненормально из-за сбоя, сбоя питания и т. Д.? Пользователь потеряет всю свою работу? Но, как это бывает, наборы данных чрезвычайно легко сериализуются, поэтому вы можете довольно легко реализовать процедуру «сохранять время от времени» для сериализации содержимого набора данных на диск, чтобы пользователь не потерял много работы.

0 голосов
/ 18 сентября 2008

Выбор действительно не зависит от самого C #. Это сводится к балансу между:

  1. Как часто вы используете данные в своем коде?
  2. Изменяются ли когда-либо данные (и вас это волнует):
  3. Какова относительная (временная) стоимость повторного получения данных по сравнению со всем, что делает ваш код?
  4. Насколько вы цените производительность против усилия разработчика / время (для данного конкретного приложения)?

Как правило: для производственных приложений, где данные меняются не часто, я бы, вероятно, однажды создал DataTable, а затем удержал бы ссылку, как вы упомянули. Я бы также подумал о том, чтобы поместить данные в типизированную коллекцию / список / словарь вместо универсального класса DataTable, если не более того, потому что компилятору легче поймать мои ошибки при печати. ​​

Для простой утилиты, которую вы запускаете для себя, которая «начинает, делает свое дело и заканчивает», это, вероятно, не стоит усилий.

Вы спрашиваете о Windows CE. В этом случае я бы, скорее всего, сделал запрос только один раз и держал результаты. Мобильные ОС имеют дополнительные ограничения в батареях и пространстве, которых нет в настольном программном обеспечении. По сути, мобильная ОС делает марку № 4 гораздо более важной.

Каждый раз, когда вы добавляете другой вызов извлечения из SQL, вы делаете вызовы во внешние библиотеки чаще, что означает, что вы, вероятно, работаете дольше, выделяете и освобождаете больше памяти (что добавляет фрагментацию), и, возможно, вызываете повторное выполнение базы данных. прочитать из флэш-памяти. Скорее всего, гораздо лучше держать данные, как только они у вас есть, при условии, что вы можете это сделать (см. пул № 2).

0 голосов
/ 18 сентября 2008

Способ определения различий между двумя основными вещами 1. Будут ли данные постоянно доступны 2. Много ли данных

Если вы постоянно используете данные в таблицах, загрузите их при первом использовании. Если вы используете данные только изредка, заполните таблицу, когда она вам понадобится, а затем отбросьте ее.

Например, если у вас есть 10 экранов графического интерфейса и вы используете myTableDataTable только на одном из них, прочитайте его только на этом экране.

...