Заполнение связанных наборов данных из адаптера таблицы

Я использую адаптеры таблиц и наборы данных в .NET (версия 2.0).

У меня есть две таблицы, как это:

Table1
------
...
TypeId

Table2
------
Id
Name

где Table1.TypeId связан с Table2.Id.

Я сильно сгенерировал эти типы с помощью мастера, поэтому теперь я могу делать такие вещи:

Table1Adapter adapter = new Table1Adapter();
Table1DataSet data = adapter.GetData();

foreach(Table1Row row in data) { ... }
// Can now iterate through and display the data

Это все работает нормально. Но теперь мне также нужны данные из таблицы 2. Я заметил, что в строке создается поле Table2Row, которое кажется идеальным, но для него установлено значение null. Как правильно заполнить этот набор данных?


person DanDan    schedule 04.08.2010    source источник


Ответы (2)


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

Не существует какого-либо API, позволяющего выполнять автоматическое заполнение всего набора типизированных данных, или такой код не создается в наборе типизированных данных, поддерживающем это. Это также сложно сделать, потому что у TableAdapters нет общего базового класса, который позволил бы вам это сделать.

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

Поэтому я рекомендую заполнять набор данных для каждой таблицы «жестким кодом».

person this. __curious_geek    schedule 04.08.2010
comment
Хорошо, и как лучше всего объединить эти данные в мою родительскую таблицу данных? - person DanDan; 04.08.2010
comment
Создайте экземпляры каждого TableAdapter и заполните набор данных. Вы не будете заполнять весь набор данных сразу, вы должны делать это потаблично. - person this. __curious_geek; 04.08.2010
comment
Итак, если у меня есть два адаптера и два набора данных, как мне обеспечить связь? Мне бы очень хотелось сделать что-то вроде row.typerow.Name - person DanDan; 04.08.2010
comment
Отношения будут навязаны, но вы не сможете получить к ним реляционный доступ. - person this. __curious_geek; 04.08.2010
comment
Для всех, кто проходит этот путь, вы можете реляционно перемещаться по таблицам в наборе данных, используя методы GetChildRows и GetParentRow. Также вы можете использовать столбцы на основе выражений для поиска в постоянных данных и т. д. - person peterG; 01.06.2013

На самом деле существует поставщик данных Microsoft под названием `MSDataShape', который обеспечивает эту функциональность. В последний раз, когда я проверял, он был помечен как подлежащий обесцениванию, и я не знаю, каков текущий статус и планы на будущее или что его заменит.

Вот пример одной «команды SQL», которая вернет, как мне кажется, DataSet с двумя хорошо связанными DataTable-ами:

   SHAPE  {select * from customers}
   APPEND ({select * from orders} AS rsOrders
           RELATE customerid TO customerid)

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

EDIT: я думаю, что этот ответ SO делает именно это, используя XML.

person G. Stoynev    schedule 10.05.2013