Опубликован: 05.08.2007 | Уровень: специалист | Доступ: платный
Лекция 9:

Объект DataView. Вывод связанных таблиц

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >

Вывод связанных таблиц. Вывод двух таблиц в один элемент DataGrid

База данных Microsoft Access BDTur_firm.mdb содержит таблицу "Туристы", которая связана с другими таблицами. Было бы удобно выводить эту таблицу в элемент DataGrid вместе с другими таблицами, а также выводить связанные записи этой таблицы. Создайте новое Windows-приложение и назовите его DataGrid2Table. Перетаскиваем на форму элемент управления DataGrid, свойству Dock устанавливаем значение Fill. Переходим в код формы и подключаем пространство имен:

using System.Data.OleDb;

В конструкторе формы создаем соединение, объект OleDbCommand, определяем для него соединение и строку CommandText:

OleDbConnection conn = new OleDbConnection(connectionString);
OleDbCommand myCommand = new OleDbCommand();
myCommand.Connection = conn;
myCommand.CommandText = commandText;

Подключаемся к файлу базы данных BDTur_firm.mdb, указываем соответствующие параметры строк connectionString и commandText:

string commandText = "SELECT [Код туриста], Фамилия, Имя, Отчество FROM Туристы";
string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"
 ";Data Source=""D:\Uchebnik\Code\Glava1\BDTur_firm.mdb"";
 ID=Admin;Jet OLEDB:Encrypt Database=False";

Создаем объект DataAdapter и в свойстве SelectCommand устанавливаем значение myCommand, открываем соединение:

OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = myCommand;
conn.Open();

Создаем объект DataSet:

DataSet ds = new DataSet();

В объекте DataSet здесь будут храниться две таблицы - главная и связанная с ней дочерняя. Поэтому воспользуемся свойством TableMappings объекта DataAdapter для занесения в него первой таблицы "Туристы":

DataSet ds = new DataSet();
dataAdapter.TableMappings.Add("Table", "Туристы");
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 с двумя таблицами. Теперь можно выводить одну из этих таблиц на форму, или две сразу. Но связь между таблицами еще не создана. Для конфигурирования отношения по полю "Код туриста" создаем два объекта DataColumn:

DataColumn dcTouristsID =
 ds.Tables["Туристы"].Columns["Код туриста"];
DataColumn dcInfoTouristsID =
 ds.Tables["Информация о туристах"].Columns["Код туриста"];

Создаем объект DataRelation, в его конструкторе передаем название отношения между таблицами и два объекта DataColumn:

DataRelation dataRelation =
 new DataRelation("Дополнительная информация", dcTouristsID, dcInfoTouristsID);

Добавляем созданный объект отношения к объекту DataSet:

ds.Relations.Add(dataRelation);

Создаем объект DataViewManager, отвечающий за отображение DataSet в объекте DataGrid:

DataViewManager dsview = ds.DefaultViewManager;

Присваиваем свойству DataSource объекта DataGrid созданный объект DataViewManager:

dataGrid1.DataSource = dsview;

Последнее, что нам осталось сделать, - сообщить объекту DataGrid, какую таблицу считать главной (родительской) и, соответственно, отображать на форме:

dataGrid1.DataMember = "Туристы";

Закрываем соединение:

conn.Close();

Запускаем приложение. Теперь можно просматривать связанные записи (рис. 9.12):

 Для перехода на дочернюю запись нажимаем на ссылку "Дополнительная информация". Для возвращения на родительскую запись нажимаем на кнопку со стрелкой

увеличить изображение
Рис. 9.12. Для перехода на дочернюю запись нажимаем на ссылку "Дополнительная информация". Для возвращения на родительскую запись нажимаем на кнопку со стрелкой

Обратите внимание, что здесь мы не стали накладывать ограничения - это сделано для упрощения кода.

Конструктор формы будет иметь следующий вид:

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;
	conn.Open();
			
	DataSet ds = new DataSet();
	dataAdapter.TableMappings.Add("Table", "Туристы");
	dataAdapter.Fill(ds);
		
	OleDbCommand myCommand2 = new OleDbCommand();
	myCommand2.Connection = conn;
	myCommand2.CommandText = commandText2;
	OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter();
	dataAdapter2.SelectCommand = myCommand2;
	dataAdapter2.TableMappings.Add("Table", "Информация о туристах");
	dataAdapter2.Fill(ds);
		
	DataColumn dcTouristsID = ds.Tables["Туристы"].Columns["Код туриста"];
	DataColumn dcInfoTouristsID =
	 ds.Tables["Информация о туристах"].Columns["Код туриста"];
	DataRelation dataRelation =
	 new DataRelation("Дополнительная информация", dcTouristsID, dcInfoTouristsID);
	ds.Relations.Add(dataRelation);
	DataViewManager dsview = ds.DefaultViewManager;
	dataGrid1.DataSource = dsview;
	dataGrid1.DataMember = "Туристы";
	conn.Close();
}

Закомментируем фрагмент кода, отвечающий за создание связи:

//DataColumn dcTouristsID = ds.Tables["Туристы"].Columns["Код туриста"];
//DataColumn dcInfoTouristsID =
// ds.Tables["Информация о туристах"].Columns["Код туриста"];
//DataRelation dataRelation =
// new DataRelation("Дополнительная информация", dcTouristsID, dcInfoTouristsID);
//ds.Relations.Add(dataRelation);
DataViewManager dsview = ds.DefaultViewManager;
dataGrid1.DataSource = dsview;
//dataGrid1.DataMember = "Туристы";
conn.Close();

Теперь в приложении будут отдельные ссылки на две таблицы - "Туристы" (рис. 9.13, А) и "Информация о туристах" (рис. 9.13, Б):

 Переход на две таблицы - "Туристы" (А) и "Информация о туристах" (Б)

увеличить изображение
Рис. 9.13. Переход на две таблицы - "Туристы" (А) и "Информация о туристах" (Б)

В программном обеспечении к курсу вы найдете приложение DataGrid2 Table (Code\Glava4\ DataGrid2Table).

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Александра Тимофеева
Александра Тимофеева
Украина, Киев
Bakke Aleksander
Bakke Aleksander
Россия, Mуниципальный округ N 4