Программирование >>  Программирование с использованием ajax 

1 ... 298 299 300 [ 301 ] 302 303 304 ... 396


SqlDataAdapter custAdapter = new SqlDataAdapter(

SELECT * FROM Customers , thisConnection); custAdapter.Fill(thisDataSet, Customers );

SqlDataAdapter orderAdapter = new SqlDataAdapter (

SELECT * FROM Orders , thisConnection); orderAdapter.Fill(thisDataSet, Orders );

SqlDataAdapter detailAdapter = new SqlDataAdapter(

SELECT * FROM [Order Details] , thisConnection); detailAdapter.Fill(thisDataSet, Order Details );

SqlDataAdapter prodAdapter = new SqlDataAdapter(

SELECT * FROM Products , thisConnection); prodAdapter.Fill(thisDataSet, Products );

DataRelation custOrderRel = thisDataSet.Relations.Add( CustOrders , thisDataSet.Tables[ Customers ].Columns[ CustomerlD ], thisDataSet.Tables[ Orders ].Columns[ CustomerlD ]);

DataRelation orderDetailRel = thisDataSet.Relations.Add( OrderDetail thisDataSet.Tables[ Orders ].Columns[ OrderlD ], thisDataSet.Tables[ Order Details ].Columns[ OrderlD ]); DataRelation orderProductRel = thisDataSet.Relations.Add (

OrderProducts , thisDataSet.Tables[ Products ].Columns[ ProductID ] thisDataSet.Tables[ Order Details ].Columns[ ProductID ]); foreach (DataRow custRow in thisDataSet.Tables[ Customers ].Rows) {

Console.WriteLine( ID заказчика: + custRow[ CustomerlD ]); foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel) ) {

Console.WriteLine( \tID заказа: + orderRow[ OrderlD ]); Console.WriteLine( \t\tflaTa заказа: + orderRow[ OrderDate ]); foreach (DataRow detailRow in

orderRow.GetChildRows(orderDetailRel))

Console.WriteLine( \t\tПpoдyкт: +

detailRow.GetParentRow(orderProductRel)[ ProductName ]); Console.WriteLine( \t\tKoличecтвo: + detailRow[ Quantity ]) ;

thisConnection.Close();

Console.Write( Программа завершена, нажмите Enter для продолжения: ); Console.ReadLine();

4. Выполните приложение. Вы увидите вывод, подобный приведенному ниже (здесь показана сокращенная версия, включающая только завершающую часть вывода):

ID заказчика: WOLZA

ID заказа: 10998

Дата заказа: 4/3/1998 12:00:00 AM Продукт: Guarana Fantastica Количество: 12 Продукт: Sirop derable Количество: 7 Продукт: Longlife Tofu



Количество: 20

Продукт: Rhbnbrau Klosterbier Количество: 30 ID заказа: 11044

Дата заказа: 4/23/1998 12:00:00 AM Продукт: Tarte au sucre Количество: 12 ID заказчика: ZACZI

Описание полученных результатов

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

SqlDataAdapter custAdapter = new SqlDataAdapter (

SELECT * FROM Customers , thisConnection); custAdapter.Fill(thisDataSet, Customers );

SqlDataAdapter orderAdapter = new SqlDataAdapter(

SELECT * FROM Orders , thisConnection); orderAdapter.Fill(thisDataSet, Orders );

SqlDataAdapter detailAdapter = new SqlDataAdapter(

SELECT * FROM [Order Details] , thisConnection); detailAdapter.Fill(thisDataSet, Order Details );

SqlDataAdapter prodAdapter = new SqlDataAdapter (

SELECT * FROM Products , thisConnection); prodAdapter.Fill(thisDataSet, Products );

Далее строятся объекты DataRelation для каждого отношения между таблицами:

DataRelation custOrderRel = thisDataSet.Relations.Add( CustOrders , thisDataSet.Tables[ Customers ].Columns[ CustomerlD ], thisDataSet.Tables[ Orders ].Columns[ CustomerlD ]);

DataRelation orderDetailRel = thisDataSet.Relations.Add( OrderDetail , thisDataSet.Tables[ Orders ].Columns[ OrderlD ], thisDataSet.Tables[ Order Details ].Columns[ OrderlD ]); DataRelation orderProductRel = thisDataSet.Relations.Add( OrderProducts , thisDataSet.Tables[ Products ].Columns[ ProductlD ], thisDataSet.Tables[ Order Details ].Columns[ ProductlD ]);

Первое отношение - точно такое, как в предыдущем примере. Следующее отношение строится между Orders и Order Details с использованием OrderlD в качестве столбца связи. Последнее отношение - между Order Details и Products с применением ProductlD в качестве столбца связи. Обратите внимание, что в этом отношении Products является родительской таблицей (второй из трех параметров). Это потому, что он представляет сторону один в отношении один ко многим (один продукт может входить во множество заказов).

Установив отношения, можно приступить к работе с ними. Опять-таки, базовая структура - вложенный цикл foreach, но на этот раз с тремя уровнями вложенности:

foreach (DataRow custRow in thisDataSet.Tables[ Customers ].Rows)

Console.WriteLine( ID заказчика: + custRow[ CustomerlD ]); foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel))



926 Часть IV. Д ocxyiF К данным

Console.WriteLine( \tID заказа: + orderRow[ OrderlD ]) ; Console.WriteLine( \t\tflaTa заказа: + orderRow[ OrderDate ])< foreach (DataRow detailRow in

orderRow.GetChildRows(orderDetailRel))

Console.WriteLine( \t\tnpoflyKT: +

detailRow.GetParentRow(orderProductRel)[ ProductName ]); Console.WriteLine( \t\tKoличecтвo: + detailRow[ Quantity ] )

Как и ранее, выводятся данные родительской строки, а затем с помощью GetChildRows () получаются дочерние строки, связанные с родительской. Внешний цикл такой же, как и в предыдущем примере. Вы печатаете дополнительные детали OrderDate в OrderlD, а затем получаете OrderDetails для этого OrderlD.

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

Вывод этой программы показывает детали заказов, принятых от каждого заказчика, со смещением, чтобы показать иерархию родителей и детей. Опять-таки, заказчик ZACZI не имеет заказов, поскольку он был только что добавлен в предыдущих примерг1х.

XML и ADO.NET

Как было отмечено во введении, поддержка XML - одна из основных проектных целей ADO.NET, и она также является центральной во внутренней реализации ADO. NET. Поэтому имело смысл, чтобы ADO.NET обеспечивал поддержку XML, встроенную в объектную модель. Вы ознакомились с основами XML в главе 23, и теперь можно приступать к изучению его поддержки со стороны ADO.NET.

Поддержка XML в объектах DataSet из ADO.NET

Поддержка ADO.NET языка XML сосредоточена вокруг объекта DataSet, поскольку XML- это отношения и иерархически структурированные данные. DataSet имеет несколько методов, обрабатывающих XML, и один из наиболее простых в применении - это WriteXml (), который записывает содержимое DataSet в документ XML.

Чтобы использовать WriteXml (), просто сконструируйте DataSet из имеющихся данных, используя тот же код, что и в предыдущих примерах, примените метод Fill () адаптера данных для загрузки данных, определите объекты DataRelation для отношений и т.д. Затем просто вызовите WriteXml () на построенном DataSet:

thisDataSet.WriteXml( nwinddata.xml );

WriteXml () может записывать в различные места; эта версия метода просто пишет XML в файл. Внешняя программа, принимающая XML в качестве входного формата, может легко прочесть и обработать этот XML.

Доступен также метод ReadXml () для чтения содержимого файла XML в DataSet.

Следующий пример берет код из DataRelationExample и просто пишет данные DataSet в файл XML; вложенные циклы foreach заменены единственным вызовом WriteXml (). Перед запуском программы необходимо обеспечить наличие каталога С:\Northwind.



1 ... 298 299 300 [ 301 ] 302 303 304 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика