Сопоставление строго типизированных наборов данных в общем методе FillDataSet в C #?

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

Вопрос

Редактировать: Я использую SqlDataAdapters для заполнения наборов данных.Извините - я должен был выразиться более ясно.

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

public static DataSet FillDataSet(DataSet dataSet, string storedProcedureName, Dictionary<string, string> parameters);

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

  • Добавьте новый формальный в мой FillDataSet способ (KeyValuePair<string, string>[] mappings), который предоставил бы информацию для сопоставления таблиц.
  • Создать DataSetMappingFactory это позволило бы использовать DataSet в качестве параметра, а затем добавить соответствующие сопоставления на основе его типа.Если бы это был неизвестный тип, то он не добавлял бы никаких сопоставлений.Затем это вернуло бы DataSet к тому FillDataSet способ.

Есть ли у кого-нибудь из вас другие мысли о том, как я мог бы подойти к этой проблеме?Кроме того, кто-нибудь хочет обсудить подход, который был бы наилучшим с точки зрения объектно-ориентированного проектирования?

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

Решение

Первый вопрос, который я бы задал, это:действительно ли мне вообще нужно это делать?Конструктор типизированных наборов данных уже предоставляет вам инструмент для определения соответствия между хранимой процедурой и DataTable.Если вы тщательно спроектируете свой набор данных, у вас уже есть метод заполнения для каждого объекта данных.Есть ли смысл изобретать это колесо заново?

Я думаю, что это возможно.Действительно здорово, что есть способ поддерживать это отображение, но все в этом отображении замораживается во время компиляции.Если вы хотите изменить сопоставление, вам необходимо перестроить свою сборку.Кроме того, типизированный дизайн набора данных не имеет дела с хранимыми процедурами, которые возвращают несколько наборов результатов.Если вы хотите в общем виде сопоставить параметры и значения, вам нужно использовать отражение для получения списков аргументов из методов Fill.Возможно, если вы посмотрите на эти факторы (и другие, о которых я не думаю), работа с существующим инструментом - это не тот путь, по которому нужно идти.

В этом случае мне кажется, что ваша цель - иметь возможность заполнить набор данных из серии хранимых процедур кодом, который знает как можно меньше о деталях реализации.Таким образом, это процесс, который будет управляться метаданными.Когда у вас есть процесс, управляемый метаданными, что будет иметь для вас наибольшее значение в долгосрочной перспективе, так это то, насколько легко будет поддерживать метаданные, используемые процессом.Как только вы заставите код работать, вы, вероятно, не будете сильно к нему прикасаться.Но вы будете постоянно изменять метаданные.

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

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

В этом наборе данных у вас будет таблица DataSetType, указывающая на тип каждого введенного набора данных, который вы собираетесь иметь возможность заполнить.У него была бы дочерняя таблица StoredProcedures со строкой для каждого вызываемого SP.Это будет иметь две дочерние таблицы, Parameter и Datatablet type.Для каждого результирующего набора, который, как ожидается, вернет SP, должна быть одна строка DataTableType, упорядоченная по порядковой позиции.Таблица Datatablet type будет иметь дочернюю таблицу сопоставления столбцов.Именно в этой таблице вы должны поддерживать сопоставления между столбцами в результирующем наборе и столбцами в заполняемой вами таблице.

Убедитесь, что все ваши отношения с данными вложены и что вы дали отношениям рациональные имена.(Мне нравится FK_childtablename_parenttablename.)

Как только у вас это будет, дизайн класса станет довольно простым.Класс имеет ссылку на набор метаданных, Соединение и т.д., И он предоставляет метод с этой сигнатурой:

public void FillDataSet(DataSet targetDs, Dictionary<string, Dictionary<string, KeyValuePair<string, string>> parameterMap);

Вы начинаете с использования типа targetDs для поиска строки DataSetType верхнего уровня.Затем все частные методы выполняют итерацию по спискам потоков данных, возвращаемых DataTable.GetChildRows() .И вы добавляете одно или два события в дизайн класса, чтобы по мере выполнения операции он мог вызывать события, чтобы вызывающее приложение знало, как оно продвигается.

Вероятно, первое, чего я ожидал бы от рефакторинга этого дизайна, - это предоставления мне более детального контроля над процессом заполнения.Например, как и было задумано, существует только один набор SPS для каждого типизированного набора данных.Что, если я хочу заполнить только подмножество набора данных?Как и было задумано, я не могу.Но вы могли бы легко сделать первичный ключ таблицы DataSetType состоящим из двух частей, причем частями будут тип DataSet и некоторый строковый ключ (с именем типа SPSetName или OperationName), и добавить вторую часть ключа в список аргументов FillDataSet.

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