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

using System.Xml;

Добавьте в класс формы новый метод InsertFromXml, в тело которого вставьте код, приведенный ниже. Метод InsertFromXml демонстрирует технику выделения текстового содержимого узлов XML-документа. Далее мы более подробно рассмотрим способы идентификации узлов при чтении произвольных XML-документов.

  void InsertFromXml()

  {

   XmlTextReader rd = null;

   try

   {

    rd = new XmlTextReader(FindAFile(@"\Students.xml"));

    string name = "", phone = "", addr = "";

    for (int i = 0; rd.Read(); )

    {

      if (rd.NodeType == XmlNodeType.Text)

      {

        switch (i % 3)

        {

           case 0: name = rd.Value; break;

           case 1: phone = rd.Value; break;

           case 2: addr = rd.Value;

             InsertStudent(name, phone, addr); break;

        }

        i++;

      }

    }

   }

   catch (XmlException ex) { MessageBox.Show(ex.Message); }

   finally { rd.Close(); }

  }

Сформировать команду вставки новой строки в таблицу базы данных мы сможем лишь после того, как прочтем все три поля (<Name>, <Phone> и <Addr>) очередной записи. Поймать это событие помогает счетчик повторений цикла for. Переменная i используется как счетчик событий вида: "прочтен еще один значимый для нас узел (типа Text)". Каждый третий такт этой последовательности событий свидетельствует о том, что данные для очередной строки таблицы накоплены, пора формировать запись и вставлять ее в таблицу студентов. Свойство Value класса XmlTextReader позволяет добыть текст узла типа Text, то есть выделить содержимое текущего узла.

·  Измените содержимое блока try в методе MainForm_Load так, чтобы он вызывал методы, иллюстрирующие  ExecuteNonQuery InsertFromXml.

cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +

  FindAFile("\\Students.mdb"));

TestExecuteNonQuery();

InsertFromXml();

ConnectAndRead();

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

Разбор XML-документа

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

Следующий код демонстрирует технику разбора содержимого произвольного XML-документа. Усвоив методы работы с классами пространства имен System.XML, вы сможете разрабатывать свои собстенные алгоритмы чтения и разбора XML-документов для того, чтобы оперативно реагировать на ошибки ввода и нарушения схемы таблиц.

Отдельные узлы XML-документа выделяются с помощью метода Read и идентифицируются с помощью свойства NodeType, имеющего тип перечисления XmlNodeType. Благодаря продуманной, теговой структуре формата XML, в процессе чтения документа можно довольно просто выполнить корректирующие действия, например, поместить прочитанный фрагмент документа в базу данных, найти и указать нарушения формата, отобразить в табличном виде, осуществлять поиск и выбор определенных узлов и т. д.

Код, метода ParseXml, рекомендуется выполнять в режиме отладки (пошагового выполнения с помощью клавиши F10) и при этом внимательно следить за содержимым окна Output. В это окно будет выводиться текст документа с пометками, поясняющими назначение его основных компонентов.

·  Добавьте метод ParseXml в класс формы и вызовите его в методе MainForm_Load.

  void ParseXml(string fileName)

  {

   XmlTextReader rd = null;

   try

   {

    rd = new XmlTextReader(FindAFile(@"\Students.xml"));

    while (rd.Read())

    {

      switch (rd.NodeType)

      {

        case XmlNodeType.Element:

           Console.Write("<" + rd.Name);

           while (rd.MoveToNextAttribute())