Технология Microsoft ADO.NET

       

Наиболее часто встречаемая задача при


Наиболее часто встречаемая задача при разработке приложений, связанных с базами данных: одновременный вывод двух таблиц на форму, причем при перемещении по записям главной таблицы в дочерней автоматически отображаются связанные записи. Мы сделаем два приложения - одно будет создано с использованием визуальных инструментов студии, другое - полностью программно. Создайте новый Windows-проект и назовите его Visual2DataGrid2Table. Из окна Toolbox перетаскиваем на форму элемент DataGrid, свойству Dock этого элемента устанавливаем значение Bottom. Добавляем элемент Splitter, его свойству Dock также устанавливаем значение Bottom. Наконец, перетаскиваем второй DataGrid, свойству Dock устанавливаем значение Fill. Дополнительно определяем следующие свойства элементов:

dataGrid1, свойство Значение
Name dgInfoTourists
CaptionText Информация о туристах
dataGrid2, свойство Значение
Name dgTourists
CaptionText Туристы
Переходим на вкладку Data окна Toolbox, перетаскиваем на форму элемент DataSet, в поле его свойства Name вводим значение "dsTourists". В появившемся окне Add DataSet выбираем "Untyped DataSet". Выделяем объект dataSet1 и в окне Properties, в поле свойства Tables нажимаем на кнопку
(...). В редакторе Tables Collection Editor нажимаем кнопку "Add" для добавления таблицы "Туристы" (TableName - "Туристы", Name - "dtTourists"). В поле свойства Columns нажимаем на кнопку
(...) и создаем следующие столбцы:

Поле Column1, свойство Значение
ColumnName Код туриста
DataType System.Int32
Unique True
Name dcTouristID
Поле Column2, свойство Значение
ColumnName Фамилия
Name dcLastName
Поле Column3, свойство Значение
ColumnName Имя
Name dcFirstName
Поле Column4, свойство Значение
ColumnName Отчество
Name dcMiddleName
Аналогично, в редакторе Tables Collection Editor создаем таблицу "Информация о туристах", а затем в редакторе Columns Collection Editor создаем ее поля:

TableName Информация о туристах
Name dtInfoTourists
Поле Column1, свойство Значение
ColumnName Код туриста
DataType System.Int32
Unique True
Name dcInfoTouristsID
Поле Column2, свойство Значение
ColumnName Серия паспорта
Name dcPassport
Поле Column3, свойство Значение
ColumnName Город
Name dcCity
Поле Column4, свойство Значение
ColumnName Страна
Name dcCountry
Поле Column5, свойство Значение
ColumnName Телефон
Name dcPhone
Поле Column6, свойство Значение
ColumnName Индекс
Name dcIndex


Завершив настройку таблиц и колонок, переходим к определению связи между таблицами. Выделяем объект dataSet1, в окне Properties в поле свойства Relations щелкаем на кнопку
(...). В появившемся редакторе Relation Collection Editor нажимаем кнопку "Add" и создаем отношение "Дополнительная_информация" между таблицами по ключевому полю "Код туриста". Завершив работу с редактором, переходим в код формы. Подключаем пространство имен для работы с базой данных Microsoft Access:
using System.Data.OleDb;
Добавляем строки для подключения к базе и извлечения данных:
string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0""; Data Source=""D:\Uchebnik\Code\Glava1\BDTur_firm.mdb""; User ID=Admin;Jet OLEDB:Encrypt Database=False"; string commandText = "SELECT [Код туриста], Фамилия, Имя, Отчество FROM Туристы"; string commandText2 = "SELECT [Код туриста], [Серия паспорта], Город, Страна, Телефон, Индекс FROM [Информация о туристах]";
В конструкторе формы создаем объекты для заполнения данными DataSet:
public Form1() {
InitializeComponent();
OleDbConnection conn = new OleDbConnection(connectionString); OleDbCommand myCommand = new OleDbCommand(); myCommand.Connection = conn; myCommand.CommandText = commandText; OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); dataAdapter.SelectCommand = myCommand;
OleDbCommand myCommand2 = new OleDbCommand(); myCommand2.Connection = conn; myCommand2.CommandText = commandText2; OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter(); dataAdapter2.SelectCommand = myCommand2;
conn.Open(); dataAdapter.Fill(dsTourists.Tables["Туристы"]); dataAdapter2.Fill(dsTourists.Tables["Информация о туристах"]); conn.Close();


dgTourists.DataSource = dsTourists; dgTourists.DataMember = "Туристы";
dgInfoTourists.DataSource = dsTourists; dgInfoTourists.DataMember = "Туристы.Дополнительная_информация"; }
Запускаем приложение (рис. 9.14):



При перемещении по записям таблицы "Туристы" автоматически выводятся связанные записи в таблице "Информация о туристах" ' width="620" height="384">

увеличить изображение
Рис. 9.14.  Готовое приложение Visual2DataGrid2Table. При перемещении по записям таблицы "Туристы" автоматически выводятся связанные записи в таблице "Информация о туристах"
Ключевым моментом здесь является определение связи "Дополнительная_информация" в содержимом элемента dgInfoTourists:
dgInfoTourists.DataMember = "Туристы.Дополнительная_информация";
Эта же связь доступна и в окне родительской таблицы - при нажатии на гиперссылку возвращается связанная запись.
В программном обеспечении к курсу вы найдете приложение Visual2 DataGrid2Table (Code\Glava4\ Visual2DataGrid2Table).
Рассмотрим теперь программную реализацию этого же приложения. Создайте новый Windows-проект и назовите его "Programm2DataGrid2Table". Скопируем из проекта Visual2DataGrid2Table два элемента DataGrid, Splitter и вставим в новую форму. Пространство имен, строки connectionString и commandText будут в точности такие же, как и в предыдущем проекте, - просто скопируйте их. Конструктор формы будет иметь следующий вид:
public Form1() { InitializeComponent(); // Создаем объект dtTourists для таблицы "Туристы" DataTable dtTourists = new DataTable("Туристы"); DataColumn dcTouristID = new DataColumn("Код туриста", typeof(int)); dcTouristID.Unique = true; DataColumn dcLastName = new DataColumn("Фамилия",typeof(string)); DataColumn dcFirstName = new DataColumn("Имя", typeof(string)); DataColumn dcMiddleName = new DataColumn("Отчество", typeof(string)); dtTourists.Columns.AddRange(new DataColumn[] { dcTouristID, dcLastName, dcFirstName, dcMiddleName }); // Создаем объект dtInfoTourists для таблицы "Информация о туристах" DataTable dtInfoTourists = new DataTable("Информация о туристах"); DataColumn dcInfoTouristsID = new DataColumn("Код туриста", typeof(int)); dcInfoTouristsID.Unique = true; DataColumn dcPassport = new DataColumn("Серия паспорта", typeof(string)); DataColumn dcCity = new DataColumn("Город", typeof(string)); DataColumn dcCountry = new DataColumn("Страна", typeof(string)); DataColumn dcPhone = new DataColumn("Телефон", typeof(decimal)); DataColumn dcIndex = new DataColumn("Индекс", typeof(decimal));


dtInfoTourists.Columns.AddRange(new DataColumn[] { dcInfoTouristsID, dcPassport, dcCity, dcCountry, dcPhone, dcIndex });
DataSet dsTourists = new DataSet(); // Добавляем таблицы в DataSet dsTourists.Tables.AddRange(new DataTable[] { dtTourists, dtInfoTourists});
// Создаем отношение между таблицами dsTourists.Relations.Add(new DataRelation("Дополнительная_информация", dcTouristID, dcInfoTouristsID));
//Подключаемся к базе и выводим данные OleDbConnection conn = new OleDbConnection(connectionString); OleDbCommand myCommand = new OleDbCommand(); myCommand.Connection = conn; myCommand.CommandText = commandText; OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); dataAdapter.SelectCommand = myCommand;
OleDbCommand myCommand2 = new OleDbCommand(); myCommand2.Connection = conn; myCommand2.CommandText = commandText2; OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter(); dataAdapter2.SelectCommand = myCommand2;
dataAdapter.Fill(dsTourists.Tables["Туристы"]); dataAdapter2.Fill(dsTourists.Tables["Информация о туристах"]); dgTourists.DataSource = dsTourists; dgTourists.DataMember = "Туристы";
dgInfoTourists.DataSource = dsTourists; dgInfoTourists.DataMember = "Туристы.Дополнительная_информация"; }
Запускаем приложение - его функциональность должна быть в точности такая же, как и в проекте Visual2DataGrid2Table.
В программном обеспечении к курсу вы найдете приложение Programm2 DataGrid2Table (Code\Glava4\ Programm2DataGrid2Table).

Содержание раздела