Создать весь DataSet из существующей хранимой процедуры - PullRequest
5 голосов
/ 08 сентября 2010

У меня есть хранимые процедуры (они принимают параметры), которые возвращают несколько результирующих наборов, и я хотел бы сохранить их в типизированном наборе данных.

Вопрос: могу ли я создать в Visual Studio 2010 типизированныйнабор данных на основе хранимой процедуры?Я знаю, что могу иметь это для одной таблицы, но мне нужен весь набор данных (несколько таблиц, по одной на каждый набор результатов)

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

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

http://support.microsoft.com/kb/322793

Процедура создания

CREATE PROCEDURE dbo.sp_GetCustOrd
AS
SELECT * FROM Customers;
SELECT * FROM Orders;

Создать набор данных

  1. В Visual Studio .NET в меню Файл выберите пункт Новый, а затем нажмите Проект.
  2. Выберите Проекты Visual Basic в разделе Типы проектов, а затем нажмите Приложение Windows в разделе Шаблоны.
  3. В меню Вид выберите Обозреватель серверов.
  4. В обозревателе серверов нажмите кнопку Подключиться к базе данных, а затем подключитесь к базе данных SQL Server Northwind.
  5. Перетащите таблицы «Заказчики» и «Заказы» из обозревателя серверов в текущий проект. Обратите внимание, что объект SqlConnection и два объекта SqlDataAdapter добавлены в проект.
  6. В окне «Свойства» нажмите «Создать набор данных», а затем добавьте обе таблицы в набор данных. Обратите внимание, что файл .xsd добавлен в проект. Файл .xsd именуется в соответствии с именем, выбранным для класса DataSet.

Добавить отношения

  1. В обозревателе решений дважды щелкните файл .xsd, созданный в предыдущем разделе.
  2. Щелкните правой кнопкой мыши таблицу «Клиенты» в конструкторе, выберите «Добавить», а затем нажмите «Новая связь».
  3. В диалоговом окне «Редактировать отношения» выберите таблицу «Заказы» в качестве дочернего элемента и нажмите кнопку «ОК». Это создает новую связь данных с именем CustomersOrders в схеме DataSet.
  4. В меню Файл выберите Сохранить, чтобы сохранить изменения.

Fill

Dim da As New SqlDataAdapter("sp_GetCustOrd", SqlConnection1)
da.SelectCommand.CommandType = CommandType.StoredProcedure
da.TableMappings.Add("Table", "Customers")
da.TableMappings.Add("Table1", "Orders")
Dim ds As New CustOrd()       ' Change this name to match .xsd file name.
da.Fill(ds)
DataGrid1.DataSource = ds
DataGrid1.DataMember = "Customers"

Я знаю, что этот пример в VB, и я искал ответ на C #. Но должно быть достаточно легко портировать.

3 голосов
/ 23 декабря 2010

Итак, давайте проведем эксперимент, чтобы посмотреть, возможно ли это.

Я создал следующую хранимую процедуру в базе данных SQL 2008:

CREATE PROCEDURE dbo.StackOverflow3668337
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 'First bit';

    SELECT 'Second bit';
END

Затем я создал новый проект вVS2010 и добавил элемент DataSet в проект.

Я создал соединение с базой данных в обозревателе серверов и перетащил элемент StackOverflow3668337 на поверхность конструктора DataSet.Вот результат:

TableAdapter from DataSet Designer

Так что это будет всего одна DataTable.Так что, к сожалению, я думаю, что ответ из коробки «Нет».

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

...