Вывод связанных таблиц
В начале этой лекции мы рассматривали две связанные таблицы — "Поставщики" и "Товары" базы данных Microsoft Access RBProduct (рис. 4.3). Элемент управления DataGrid позволяет представлять несколько связанных между собой таблиц.
Создайте новое приложение, назовите его DataGrid2Table. На создавшейся форме размещаем DataGrid, свойству этого элемента Dock устанавливаем значение Fill.
Подключаем пространство имен:
using System.Data.OleDb;
Создаем соединение и открываем его:
OleDbConnection conn = new OleDbConnection(connectionString); conn.Open();
Создаем объект OleDbCommand и определяем для него соединение и строку CommandText:
OleDbCommand myCommand = new OleDbCommand(); myCommand.Connection = conn; myCommand.CommandText = commandText;
Подключаемся к файлу базы данных Microsoft Access RBProduct.mdb, указываем соответствующие параметры строк connectionString и commandText:
Листинг 4.17.
(html, txt)
Создаем объект DataAdapter и в свойстве SelectCommand устанавливаем значение myCommand:
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); dataAdapter.SelectCommand = myCommand;
Создаем объект DataSet:
DataSet ds = new DataSet();
В объекте DataSet здесь будут храниться две таблицы — главная и связанная с ней дочерняя. Поэтому воспользуемся свойством TableMappings объекта DataAdapter для занесения в него первой таблицы "Поставщики":
dataAdapter.TableMappings.Add("Table", "Поставщики");
Заполняем объект ds данными из dataAdapter:
dataAdapter.Fill(ds);
Свойству DataSource объекта dataGrid1 указываем таблицу "Поставщики" объекта ds. Обратите внимание на синтаксис — свойство Tables подразумевает наличие нескольких таблиц в объекте DataSet:
dataGrid1.DataSource = ds.Tables["Поставщики"].DefaultView;
Закрываем соединение:
conn.Close();
Запускаем приложение. Пока на форме появляется только одна таблица. Закрываем приложение и переходим в код формы. Теперь нам следует добавить объекты OleDbDataAdapter и OleDbCommand для таблицы "Товары":
OleDbCommand myCommand2 = new OleDbCommand(); myCommand2.Connection = conn; myCommand2.CommandText = commandText2; OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter();
Обратите внимание — dataAdapter2 использует то же самое подключение conn, что и dataAdapter.
Строку commandText2 определим следующим образом:
string commandText2 = "SELECT [Код поставщика], [Код продукта], Наименование, [Цена, $] FROM Товары";
Теперь свяжем второй объект OleDbDataAdapter с только что созданной второй командой и отобразим "Товары" на его таблицу. Затем можно заполнить объект DataSet данными из второй таблицы:
dataAdapter2.SelectCommand = myCommand2; dataAdapter2.TableMappings.Add("Table", "Товары"); dataAdapter2.Fill(ds);
В итоге у нас получился объект DataSet с двумя таблицами. Теперь можно выводить одну из этих таблиц на форму или две сразу. Но связь между таблицами еще не создана. Объявим объект DataRelation:
DataRelation dataRelation;
Этот объект будет представлять собой отношение между таблицами, связанными по полю "Код поставщика" (см. рис. 4.2). Для конфигурирования этого отношения нам понадобятся два объекта типа DataColumn:
DataColumn dataColumn1; DataColumn dataColumn2;
Присваиваем каждому из этих объектов поле, по которому связаны таблицы:
dataColumn1 = ds.Tables["Поставщики"].Columns["Код поставщика"]; dataColumn2 = ds.Tables["Товары"].Columns["Код поставщика"];
Конструктору объекта dataRelation передаем имя отношения между таблицами и два объекта DataColumn:
dataRelation = new DataRelation("Товары этого поставщика", dataColumn1,dataColumn2);
Добавляем созданный объект отношения к объекту DataSet:
ds.Relations.Add(dataRelation);
Создаем объект DataViewManager, отвечающий за отображение DataSet в объекте DataGrid:
DataViewManager dsview = ds.DefaultViewManager;
Присвоим свойству DataSource объекта DataGrid созданный объект DataViewManager:
dataGrid1.DataSource = dsview;