Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:

Рис. 22.20. Просмотр связанных объектов DataTable
Чтобы упростить ситуацию, тип MainForm будет использовать построители команд (по одному для каждой таблицы) для автоматического генерирования SQL-команд каждого из трех объектов SqlDataAdapter. Вот исходная модификация соответствующего экземпляра типа Form:
public partial class MainForm: Form {
// Объект DataSet для формы.
private DataSet carsDS = new DataSet("CarsDataSet");
// Применение построителей команд для упрощения
// настройки адаптеров данных.
private SqlCommandBuilder sqlCBInventory;
private SqlCommandBuilder sqlCBCustomers;
private SqlCommandBuilder sqlCBOrders;
// Адаптеры данных (для каждой из таблиц).
private SqlDataAdapter intTableAdapter;
private SqlDataAdapter custTableAdapter;
private SqlDataAdapter ordersTableAdapter;
// Объект соединения для формы.
private SqlConnection cn = new SqlConnection("server= (local);uid=sa;pwd=;database=Cars");
…
}
Конструктор формы выполняет основную работу по созданию членов-переменных для данных и заполнению DataSet. Обратите также внимание на вызов приватной вспомогательной функции ВuildTableRelationship().
public MainForm() {
InitializeComponent();
// Создание адаптеров.
invTableAdapter = new SqlDataAdapter("Select * from Inventory", cn);
custTableAdapter = new SqlDataAdapter("Select * from Customers", cn);
ordersTableAdapter = new SqlDataAdapter("Select * from Orders", cn);
// Автогенерирование команд.
sqlCBInventory = new SqlCommandBuilder(invTableAdapter);
sqlCBOrders = new SqlCommandBuilder(ordersTableAdapter);
sqlCBCustomers = new SqlCommandBuilder(custTableAdapter);
// Добавление таблиц в DataSet.
invTableAdapter.Fill(carsDS, " Inventory");
custTableAdapter.Fill(carsDS, "Customers");
ordersTableAdapter.Fill(carsDS, "Orders");
// Создание отношений между таблицами.
BuildTableRalationship();
// Привязка к элементам управления.
dataGridViewInventory.DataSource = carsDS.Tables["Inventory"];
dataGridViewCustomers.DataSourсе = carsDS.Tables["Customers"];
dataGridViewOrders.DataSource = carsDS.Tables["Orders"];
}
Вспомогательная функция BuildTableRelationship() делает в точности то, что от нее ожидается. Напомним, что база данных Cars имеет ряд отношений "родитель-потомок", что учитывается в следующем фрагменте программного кода:
private void BuildTableRelationship() {
// Создание объекта отношения CustomerOrder.
DataRelation dr = new DataRelation("CustomerOrder", carsDS.Tables["Customers"].Columns["CustID"], carsDS.Tables["Orders"].Columns["CustID"]);
carsDS.Relations.Add(dr);
// Создание объекта отношения InventoryOrder.
dr = new DataRelation("InventoryOrder", carsDS.Tables["Inventory"].Columns["CarID"], carsDS.Tables["Orders"].Columns["CarID"]);
carsDS.Relations.Add(dr);
}
Теперь, когда объект DataSet заполнен и отсоединен от источника данных, вы можете работать со всеми таблицами локально. Можно вставлять, обновлять или удалять значения любого из трех DataGridView. Как только вы будете готовы отправить измененные данные обратно в хранилище данных для обработки, щелкните на кнопке обновления формы. Программный код соответствующего обработчика события Click должен быть вам понятен.
private void btnOpdate_Cliсk(object sender, EventArgs e) {
try {
invTableAdapter.Update(carsDS, "Inventory");
custTableAdapter.Update(carsDS, "Customers");
ordersTableAdapter.Update(carsDS, "Orders");
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
После щелчка на кнопке обновления вы обнаружите, что каждая из таблиц в базе данных Cars соответствующим образом изменена.
Навигационные возможности для связанных таблиц
Чтобы продемонстрировать возможности 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";
Интервал:
Закладка: