Для демонстрации возможностей использования объектов DataRelation создайте новый проект Windows Forms с именем MultitabledDataSet. Графический интерфейс пользователя этого приложения достаточно прост. На рис. 22.20 вы можете видеть три элемента управления DataGridView, содержащие данные из таблиц Inventory, Orders и Customers базы данных Cars. Кроме того, там присутствует одна кнопка, с помощью которой информация обо всех изменениях направляется в хранилище данных.
Рис. 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.