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

Приведу еще один метод, который использовался во время отладки. Сейчас он не нужен, но может пригодиться, если вы начнете усовершенствовать код класса, или вводить новую функциональность.

void ShowChanges (int id)

  {

   string name = ds.Tables[id].TableName;

   Console.Write ("\n" + name + " Added: ");

   if (changes.Added[id].Count == 0)

    Console.WriteLine ("Null");

   foreach (DataRow row in changes.Added[id])

    Console.Write ("\n" + row[0] + ", " + row[1] + ", " + row[2]);

   Console.Write ("\n" + name +  " Deleted: ");

   if (changes.Deleted[id].Count == 0)

    Console.WriteLine ("Null");

   foreach (DataRow row in changes.Deleted[id])

    Console.Write ("\n" + row[0] + ", " + row[1] + ", " + row[2]);

   Console.Write ("\n" + name + " Changed: ");

   if (changes.Changed[id].Count == 0)

    Console.WriteLine ("Null");

   foreach (DataRow row in changes.Changed[id])

    Console.Write ("\n" + row[0] + ", " + row[1] + ", " + row[2]);

  }

Итак, мы решили проблему внесенния изменений в БД при наличии отягчающих обстоятельств, как то: использование автоматически инкрементируемых ключей (счетчиков), и одновременная работа с таблицами, с типом связи один-ко многим.

До сих пох мы работали с обычным, или обобщенными наборами данных (DataSet). Далее, рассмотрим способы создания типизированных DataSet и приемы работы с ними.

Работа с типизированными наборами данных

Различия между типизированным и обычным наборами данных

Типизированный набор данных — это класс (производный от DataSet), который сгенерирован мастером студии на основе схемы XML-документа (xsd-файла), или файла с базой данных (mdf, или mdb). Обычный набор данных не имеет соответствующей ему схемы и непосредственно является объектом класса DataSet. В типизированном наборе присутствуют методы, свойства и события, которые работают с определенными типами данных. Типы данных вычисляются мастером на основе xsd-схемы или данных о ней, почерпнутых их БД.

·  Работая с обычным DataSet, мы все время должны думать о преобразовании типов данных. Например.

   byte mark = byte.Parse(ds.Tables["Exams"].Rows[0]["Mark"].ToString());

·  Работая с типизированным набором данных (например, классом StudentsDataSet, производным от DataSet), мы не должны заботиться о приведении типов.

   byte mark = ds.Exams[0].Mark;

Причиной такого упрощения является то, что при генерации типизированного набора данных мастер студии создает (и вкладывает внутрь класса StudentsDataSet) новый класс ExamsDataTable, производный от DataTable. В этом классе он определяет индексатор, который возвращает строку таблицы, поддерживаемую классом ExamsRow. Класс ExamsRow вложен в ExamsDataTable и настроен на конкретные типы данных колонок конкретной таблицы (экзаменов). Поэтому обращение к полю оценки выглядит значительно проще. Работа с типизированным набором данных более надежна, так как несоответствие типов данных обнаруживается на этапе выполнения.

Самым важным преимуществом типизированного DataSet является поддержка со стороны механизма IntelliSense. Имена полей данных конкретной БД встраиваются в имена классов и это сильно упрощает разработку кода. Так как типизированный DataSet создается на основе xsd-схемы, которая, прежде всего, является XML-документом, то сначала надо более подробно рассмотреть суть XML-технологий.

Подробнее об XML-технологях

Язык XML (eXtensible Markup Language) постепенно становится общепринятым международным стандартом описания и надежного хранения данных со сложной структурой. Повышенная надежность языка основана на избыточности вспомогательной информации, которая имеет вид тегов, определяющих границы XML-элементов.

При разработке .NET компания Microsoft выбрала XML в качестве базового языка для обмена информации между компонентами распределенных многослойных (multi-tier) приложений. Язык XML широко используется не только при обмене данными в архитектуре ADO.NET, но также и при описании ресурсов, решений и проектов студии.