Сколько объектов DataTable мне следует использовать в моем приложении C#?

StackOverflow https://stackoverflow.com/questions/87514

Вопрос

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

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

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

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

... // other code

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

Это было полезно?

Решение

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

Другие советы

Способ решить Varys между двумя несколькими небольшими вещами 1.Данные будут постоянно доступны 2.Много ли данных

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top