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

Я постараюсь максимально упростить свою задачу.

Не стесняйтесь комментировать и поправлять мой английский. Надеюсь, ты меня понимаешь.

Мой главный вопрос: Есть ли простой и «автоматический» способ заполнить таблицу в наборе данных только строками, относящимися к данным в другой таблице?

Допустим, у нас есть база данных со следующей схемой:

Схема базы данных

Теперь я пытаюсь сделать то же самое с таблицей «Заказы» и создать собственный метод «FillByDate». Это работает, но есть небольшая проблема:

        DataSet1 myDataSetInstance = new DataSet1();
        DataSet1TableAdapters.OrdersTableAdapter OrdersTA = new DataSet1TableAdapters.OrdersTableAdapter();

        OrdersTA.FillByDate(myDataSetInstance.Orders, new DateTime(2013, 1,1), DateTime.Now);

        foreach (var row in myDataSetInstance.Orders)
        {
            MessageBox.Show(row.Comments); // OK
            MessageBox.Show(row.CustomersRow.Name); //NULL
        }

Получить соответствующую строку из таблицы «Клиенты» невозможно - сначала мне нужно вручную заполнить эту таблицу. Я вижу два способа сделать это

  • Получение всего содержимого этой таблицы - но это будет МНОГО ненужных данных
  • Создать собственный запрос в его TableAdapter - что-то вроде FillByOrdersByDate (@ Date1, @ Date2) - это легко, когда у меня есть только 2 таблицы и 1 отношение, но с большим количеством таблиц этот метод потребует десятков настраиваемых запросов для каждого TableAdapter.

Я действительно верю, что должен быть "лучший" способ сделать это.


person Jakub Szułakiewicz    schedule 10.03.2013    source источник


Ответы (2)


Пара способов подойти к этому - если вы собираетесь только читать данные, вы можете использовать запрос соединения для заполнения набора данных. В качестве альтернативы вы можете использовать запрос соединения для заполнения дочерней таблицы. Рассматривая ваш пример, предположим, что вы хотите составить список клиентов и заказов для всех клиентов в определенном городе. Вы уже написали запрос FillbyCity для своей клиентской технической поддержки - вы должны написать аналогичный запрос FillbyCity для своих заказов ta. Да, вы можете использовать для этого соединение с таблицей клиентов: ВЫБРАТЬ заказы. * FROM Orders INNER JOIN customers ON customers.customerid = orders.customerid WHERE customers.city = @city Затем вы могли бы использовать сопоставление данных, чтобы связать отдельных клиентов с их заказы, в зависимости от требований вашего приложения.

(Если у вас есть «Программирование ADO.Net 2.0» Дэвида Счеппы, это рассматривается в главе 7)

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

(PS с вашим английским все в порядке, не считая того, что вы смешиваете его и его - но многие носители языка тоже так делают.)

person peterG    schedule 11.03.2013
comment
Использование JOIN объединит connect связанные таблицы в единую таблицу. OP говорит о ведении нескольких связанных таблиц в DataSet. - person G. Stoynev; 10.05.2013
comment
G. Я не думаю, что вы читаете мой SQL достаточно внимательно. Метод состоит в том, чтобы использовать запрос JOIN, но извлекать данные только из одной таблицы. Это достигнет того, чего пытался достичь ОП. Я не предлагал «обычный» запрос JOIN именно по той причине, которую вы упомянули. - person peterG; 11.05.2013

Есть неясное ... даже не знаю, как это назвать - расширение ADO.NET SQL или что-то в этом роде - команда под названием SHAPE, которая описывает отношения, которые вы ищете, и ADO.NET использует это " специальный "SQL", чтобы дать вам набор данных, который красиво содержит несколько связанных таблиц.

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

Он прекрасно работает, но я думаю, что он старый и почти не поддерживается

MS предлагает обесценить поставщика SHAPE и вместо этого использовать XML (извините - ссылка потеряна, но она вернулась в .NET 1.1), и они указывали на XML. Я думаю, что предложение FOR XML T-SQL помогает. Я сам этого не делал (пока), где я использую FOR XML для заполнения DataSet, но если вы перейдете по ссылке в ответе Я оставил другой похожий вопрос, думаю, он сработает.

person G. Stoynev    schedule 10.05.2013