Множественные таблицы в объекте DataSet (Набор данных)
Каждый объект DataSet (Набор данных) содержит коллекцию из одного или более объектов1,DataTable (Таблица данных). Каждый объект DataTable (Таблица данных) соответствует одной таблице. С помощью свойства SelectCommand, в котором содержится операция соединения, можно производить выборку из нескольких таблиц базы данных в один объект DataTable (Таблица данных). При необходимости обновить содержимое множественных таблиц достаточно определить лишь команду обновления, так как информация о связях между таблицами базы данных уже известна. В файле Hotel-Bookings, h нашего примера свойство SelectCommand объекта SqlDataAdapter, содержащегося в объекте HotelBroker (Посредник, бронирующий места в гостинице), определено следующим образом:
String *cmd = // Строка
"select Customerld, HotelName, City, ArrivalDate, // выбрать
DepartureDate, Reservationld from Reservations, Hotels
where Reservations.Hotelld = Hotels.Hotelld";
// где Резервирование.Hotelld = Гостиницы.Hotelld"; adapter->SelectCommand = new SqlCommand(cmd, conn); dataset = new DataSet; // новый Набор данных adapter->Fill(dataset, "Reservations");
// Заполнить (набор данных, "Резервирование")
В этом случае DataSet (Набор данных) содержит один объект DataTable (Таблица данных), представляющий таблицу, называющуюся Reservations (Резервирование). Информация о том, что некоторые данные получены из таблицы Hotels, не сохраняется.
В один набор данных можно загрузить данные нескольких таблиц. Это продемонстрировано в примере DataSchema, в котором используется база данных Northwind.
adapter->SelectCommand = new SqlCommand(
"select * from [Order Details] where Productld = 1",
// "выбрать * из [Подробности заказа] где Productld = 1 ",
conn);
adapter->FillSchema (
dataset, SchemaType::Source, "Order Details");
// набор данных, SchemaType:: Источник, " Подробности заказа");
adapter->Fill(dataset, "Order Details");
// Заполнить (набор данных, " Подробности заказа");
adapter->SelectCommand =
new SqlCommand("select * from Shippers", conn);
// выбрать * из Грузоотправителей adapter->FillSchema(
dataset, SchemaType::Source, "Shippers");
// набор данных, SchemaType:: Источник, "Грузоотправители"); adapter->Fill(dataset, "Shippers"); // Заполнить (набор данных, "Грузоотправители");
В этом случае объект DataSet (Набор данных) содержит две таблицы, OrderDetails и Shippers. Метод SqlDataAdapter: :FillSchema заполняет DataSet (Набор данных) данными из таблиц, а также информацией о первичных ключах, связанных с таблицами. Затем программа просматривает содержимое таблиц и выводит на печать данные и первичные ключи таблиц. Доступ к содержащимся в DataTable (Таблица данных) объектам DataColumn осуществляется с помощью коллекции Columns (Столбцы), также являющейся частью объекта DataTable (Таблица данных).
lEnumerator *pEnum = dataset->Tables->GetEnumerator();
// набор данных-> Таблицы while (pEnum->MoveNext ()) {
DataTable *t =
dynamic_cast<DataTable *>(pEnum->Current); Console::WriteLine(t->TableName); DataColumn *dc [] = t->PrimaryKey; for (int i=0; i<dc->Length; i++)
{
Console::WriteLine(
"\tPrimary Key Field {0} = {!}", // " \t Поле первичного ключа {0} = {1} ", _box(i),
dc[i]->ColumnName); }
Console::Write("\t"); // Запись
lEnumerator *pEnum = t->Columns->GetEnumerator(); // Столбцы while (pEnum->MoveNext()) {
DataColumn *c =
dynamic_cast<DataColumn *>(pEnum->Current); Console::Write ("{0, -20}", c->ColumnName); // Запись }
Console::WriteLine("");
pEnum = t->Rows->GetEnumerator() ; // Строки while (pEnum->MoveNext()) {
DataRow *r =
dynamic_cast<DataRow *>(pEnum->Current) ; Console::Write("\t"); // Запись for (int i=0; i<r->ItemArray.Length; i++) Console::Write ( // Запись "{0, -20}",
r->get_Item(i)->ToString()->Trim()); // Вырезка Console::WriteLine(""); } }
Программа выводит на экран название таблицы, первичные ключи, названия столбцов и данные таблиц:
Order Details
Primary Key Field 0 = OrderlD
Primary Key Field 1 = ProductID
OrderlD ProductID UnitPrice Quantity Discount
10285 1 14.4 45 0.2
10294 1 14.4 18 0
Shippers
Primary Key Field 0 = ShipperlD ShipperlD CompanyName Phone
1 Speedy Express (503) 555-9831
2 United Package (503) 555-3199
3 Federal Shipping (503) 555-9931
А вот и перевод:
Подробности заказа
Поле первичного ключа 0 = OrderlD
Поле первичного ключа 1 = ProductID
Идентификатор заказа Идентификатор продукта Цена Количество Скидка
10285 1 14.4 45 0.2
10294 1 14.4 18 О
Грузоотправители
Поле первичного ключа 0 = ShipperlD
Идентификатор грузоотправителя Название компании Телефон
1 Быстрый экспресс (503) 555-9831
2 Объединение пакет (503) 555-3199
3 Федеральная отгрузка (503) 555-9931
CompEbook.ru Железо, дизайн, обучение и другие