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

<StudentsList>

<![CDATA[Этот текст может содержать символы < и >, а также теги вида:

<Name>My name</Name>,но они не будут восприняты как отдельные узлы документа,

так как находятся внутри секции CDATA (Character DATA).

Признаком завершения секции являются идущие подряд два символа: ] ] > ]]>

<Students Hobby="Sport" Language="English">

  <Name>Николай Рукосуев</Name>

  <Phone>444-4444</Phone>

  <Addr>Гражданский пр. 44-44</Addr>

</Students>

<Students Hobby="Music">

  <Name>Екатерина Ефремова</Name>

  <Phone>555-5555</Phone>

  <Addr>Северный пр. 55-55</Addr>

</Students>

<Students>

  <Name>Константин Шулов</Name>

  <Phone>777-7777</Phone>

  <Addr>Есенина 77-77</Addr>

</Students>

</StudentsList>

Проанализируйте структуру документа. Корневой элемент StudentsList содержит три сложных элемента Students, каждый из которых состоит из трех простых элементов: Name, Phone и Addr. Заметьте, что здесь отсутствует первый столбец таблицы (первичный ключ). Его данные должен генерировать драйвер Access, так как он относятся к категории автоинкрементируемого первичного ключа. Вы помните, что при создании таблицы мы установили для этого столбца свойство Increment.

Несмотря на то, что ExecuteNonQuery возвращает лишь количество измененных записей, мы все-таки имеем возможность с его помощью передавать и возвращать данные. Для этой цели надо использовать коллекцию параметров (Parameters), которая имеется в каждом объекте DbCommand. Введите в класс формы новый метод InsertStudent, в котором будет показана техника оперирования параметрами объекта DbCommand.

  void InsertStudent(string name, string phone, string addr)

  {

   //==== Формируем команду вставки новых строк таблицы

   OleDbCommand cmd = new OleDbCommand("Insert into Studs(Name, Phone, Addr)" +

    " Values (?, ?, ?)", cn);

   //==== Добавляем свои параметры в коллекцию параметров команды

   cmd.Parameters.Add(new OleDbParameter("Name", OleDbType.VarChar, 50)).Value = name;

   cmd.Parameters.Add(new OleDbParameter("Phone", OleDbType.VarChar, 30)).Value = phone;

   cmd.Parameters.Add(new OleDbParameter("Addr", OleDbType.VarChar, 255)).Value = addr;

   try  // Попытка выполнить команду

   {

    cn.Open();

    string s = cmd.ExecuteNonQuery().ToString();

    Console.WriteLine("\nВставлена {0} запись", s);

   }

   catch (OleDbException e) { MessageBox.Show(e.Message); }

   finally { cn.Close(); }

  }

Обратите внимание на типы параметров (например, OleDbType.VarChar). Они должны соответствовать типам, заданным при создании таблицы в Access. Синтаксис команды INSERT мы рассматривали ранее. Более подробные сведения о языке SQL вы можете получить, например, в книге: Jeffrey R. Shapiro. Microsoft SQL Server 2005: The Complete Reference: McGraw-Hill/Osborne 2007, доступной в электронном варианте.

Три объекта класса string (name, phone и addr) необходимо преобразовать в три параметра (?,?,?) и типы последних должны соответствовать специализированным типам OleDb, заданным на этапе создания таблицы.

Открытие и чтение XML-файла удобно выполнять с помощью класса XmlTextReader. Его метод Read вычитывает отдельные, так называемые узлы (nodes) документа. Функциональность узлов документа реализует класс XmlNode и производные от него классы.

Так как нам необходимо различать лишь типы узлов, то достаточно использовать свойство NodeType, которое имеется в классе XmlTextReader. Оно имеет тип перечисления (XmlNodeType), характеризующего все возможные типы узлов. Константа Text этого перечисления соответствует тем строковым элементам данных, которые мы хотим выудить из файла. Вспомните, что интересующие нас данные расположены между открывающими и закрывающими тегами: <Name></Name>, <Phone></Phone> и <Addr></Addr>. Именно там находятся XML-узлы типа Text, поэтому из всего множества узлов мы будем выбирать именно эти узлы. Для того, чтобы новые сущности библиотеки .NET Framework стали доступны нашему приложению, добавьте директиву.