Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Навигационные возможности для связанных таблиц

Навигационные возможности для связанных таблиц

Чтобы продемонстрировать возможности DataRelation при программной реализации доступа к данным связанных таблиц, добавьте в форму новый тип Button и соответствующий ему TextBox. В результате конечный пользователь должен получить возможность ввести идентификационный номер заказчика и увидеть информацию о заказе соответствующего клиента, которая выводится в простом окне сообщения. Обработчик события Click этой кнопки реализован так.

private void btnGetInfo_Click(object sender, System.EventArgs e) {
 string strInfo = "";
 DataRow drCust = null;
 DataRow[] drsOrder = null;
 // Получение указанного CustID из TextBox.
 int theCust = int.Parse(this.txtCustID.Text);
 // Получение для CustID соответствующей строки таблицы Customers.
 drCust = carsDS.Tables["Customers"].Row[theCust];
 strInfo += "Заказчик №" + drCust["CustID"].ToString() + "n";
 // Переход от таблицы заказчиков к таблице заказов.
 drsOrder = drCust.GetChildRows(carsDS.Relations["CustomerOrder"]);
 // Получение номера заказа.
 foreach (DataRow r in drsOrder) strInfo += "Номер заказа: " + r["OrderID"] + "n";
 // Переход от таблицы заказов к таблице ассортимента.
 DataRow[] drsInv = drsOrder[0].GetParentRows(carsDS.Relatios["InventoryOrder"]);
 // Получение информации о машине.
 foreach (DataRow r in drsInv) {
  strInfo += "Марка: " + r["Make"] + "n";
  strInfo += "Цвет: " + r["Color"] + "n";
  strInfo += "Название: " + r["PetName"] + "n";
 }
 MessageBox.Show(stxInfo, "Информация для данного заказчика");
}

Как видите, ключом к решению задачи перемещения между таблицами данных оказывается использование ряда методов, определённых типом DataRow. Давайте разберем этот программный код но порядку. Сначала вы получаете подходящий идентификационный номер заказчика из текстового блока и используете этот номер для того, чтобы найти соответствующую строку в таблице Customers (конечно же, с помощью свойства Rows), как показано ниже.

// Получение указанного CustID из TextBox.
int theCust = int.Parse(this.txtCustID.Text);
// Получение для CustID соответствующей строки таблицы Customers.
DataRow drCust = null;
drCust = carsDS.Tables["Customers"].Raws[theCust];
strInfo += "3аказчик №" + drCust["CustID"].ToString() + "n";

Затем вы переходите от таблицы Customers к таблице Orders, используя отношение CustomerOrder. Обратите внимание на то, что метод DataRow.GetChildRows() позволяет получить доступ к строкам дочерней таблицы. После этого вы можете прочитать информацию из этой таблицы.

// Переход от таблицы заказчиков к таблице заказов.
DataRow[] drsOrder = null;
drsOrder = drCast.GetChildRows(carsDS.Relations["CustomerOrder"]);
// Получение номера заказа.
foreach(DataRow r in drsOrder) strInfo += "Номер заказа: " + r["OrderID"] + "n";

Заключительным шагом является переход от таблицы Orders к родительской таблице (Inventory) с помощью метода GetParentRows(). После этого вы сможете прочитать информацию из таблицы Inventory для столбцов Make, PetName и Color. как показано ниже.

// Переход от таблицы заказов к таблице ассортимента.
DataRow[] drsInv = drsOrder[0].GetParentRows(carsDS.Relations["InventoryOrder"]);
foreach(DataRow r in drsInv) {
 strInfo += "Марка: " + r["Make"] + "n";
 strInfo += "Цвет: " + r["Color"] + "n";
 strInfo += "Название: " + r["PetName"] + "n";
}

На рис. 22.21 показан один из возможных вариантов вывода.


Рис. 22.21. Навигация по связанным данным

Этот пример убеждает в пользе типа DataSet. Поскольку DataSet отсоединяется от соответствующего источника данных, вы можете работать с копией данных, размещенной в памяти, переходя от одной таблицы к другой и выполняя все необходимые модификации, удаления или вставки. По завершении этой работы вы можете направить свои изменения в хранилище данных для их обработки.

Исходный код. Проект MultitabledDataSetApp размещен в подкаталоге, соответствующем главе 22.

Оглавление книги


Генерация: 3.769. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз