ADO.NET. Управление базами данных. Связь по схеме OLE DB провайдера. Коррекция стилей DataGridView, страница 3

·  Метод Fill адаптера связи открывает соединение, создает и заполняет единственную в DataSet безымянную таблицу данными, полученными из таблицы Studs базы Students.mdb. Затем он закрывает соединение.

·  Ветвь finally комбинации операторов try-catch-finally будет вызвана, как в случае успеха соединения, так и в случае его неудачи. В случае успеха соединение уже закрыто методом Fill.

Соединение с базой данных следует разрывать сразу же после обмена данными. Это важный момент работы с данными, характерный для технологии ADO.NET. Напомним, что одной из главных концепций ADO.NET является работа в отсоединенном режиме.

В MSDN приведены примеры, в которых перед тем как вызвать метод Fill, производится открытие соединения с базой данных: cn.Open();. Этот оператор можно опустить, так как метод Fill способен сам открыть соединение. Он же его и закрывает. Но, если соединение было открыто, то метод Fill оставляет его открытым.

SQL, или Structured Query Language (принято произносить sequel) de facto является стандартным языком общения с реляционными базами данных. Он вместе с идеей реляционных баз был изобретен компанией IBM для реализации математических концепций реляционной алгебры. Любопытным фактом является то, что Dr. Codd (который впервые опубликовал правила языка) не любил его и предпочитал пользоваться другим языком запросов.

Проверьте свои знания языка запросов SQL (или интуицию). Создайте команду, которая выбирает только тех студентов, которые получили пятерку по математике. Для этого понадобится таблица экзаменов.

DataSet на допросе

Покажем, как получить информацию о текущем состоянии набора данных DataSet: множестве ее таблиц, составе каждой таблицы и т. д., не прибегая к помощи DataGridView. В некоторых случаях такой прием может оказаться весьма полезным и эффективным. Он более экономен, чем предыдущий вариант, так как не требует наличия ресурсоемкого элемента DataGridView. Временно вставьте такой фрагмент кода в метод MainForm_Load.

DataTableCollection dt = ds.Tables;  // DataSet может содержать несколько таблиц

Console.WriteLine("\nDataSet содержит {0} таблицу", dt.Count);

foreach (DataTable t in dt)

{

  Console.WriteLine("Таблица " + t.TableName +

   " имеет {0} строки и {1} столбца", t.Rows.Count, t.Columns.Count);

  DataColumnCollection dc = t.Columns;

  Console.WriteLine("\nКол-во столбцов таблицы: {0} ", dc.Count);

  int i = 1;

  foreach (DataColumn c in dc)

   Console.WriteLine("{0}. {1,-13}, типа:  {2}", i++, c.ColumnName, c.DataType);

  Console.WriteLine("\nДанные таблицы:");

  DataRowCollection dr = t.Rows;

  foreach (DataRow r in dr)

  {

   Console.WriteLine ();

   for (i=0;  i < dc.Count;  i++)

    Console.Write("{0}. ", r[i]);

  }

  Console.WriteLine ("\n\n");

}

Запустите приложение в режиме отладки (F5). В окне Output вы увидите результаты допроса DataSet (если вы его не видите, то дайте команду Debug®Windows®Output).  Метод WriteLine класса Console использует его для вывода своих параметров. Пользуйтесь этой возможностью для отладки всех Windows-приложений. Проанализируйте содержимое окна, сопоставляя его с кодом фрагмента. Классы: DataTableCollection, DataColumnCollection и DataRowCollection позволяют просмотреть содержимое всего набора данных, не прибегая к помощи DataGridView. Все рассмотренные типизированные коллекции происходят от общего класса InternalDataCollectionBase.

После анализа результатов уберите фрагмент допроса DataSet, а также осторожный код вида try-catch-finally. Этот код преследовал чисто учебные цели, он не понадобится нам далее. Оставьте лишь три строки:

da.Fill (ds, "Studs");

gridStud.DataSource = ds;  // Complex DataBinding

gridStud.DataMember = ds.Tables[0].TableName;

Не комментируйте старые блоки кода, вы всегда можете их восстановить с помощью этого Word-документа.

Коррекция стилей DataGridView