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

Строки префикса и суффикса ("[", "]") я задал такими, потому, что видел их в коде, сгенерированном мастерами студии. Они работают, как в Access, так и в SQL Server. Очень странным показался результат следующего фрагмента, который выуживает префикс и суффикс, принятый в Access. Выполните этот фрагмент и убедитесь, что Access хочет использовать один и тот же символ (` — это не апостроф!) для префикса и суффикса.

   cn.Open();

   DataTable schema = cn.GetOleDbSchemaTable(

    OleDbSchemaGuid.DbInfoLiterals, new object[] { });

   cn.Close();

   schema.PrimaryKey = new DataColumn[] { schema.Columns["LiteralName"] };

   DataRow row = schema.Rows.Find("Quote_Prefix");

   if (row != null)

    Console.WriteLine ("Префикс: " + row["LiteralValue"]);

   row = schema.Rows.Find("Quote_Suffix");

   if (row != null)

    Console.WriteLine("Суффикс: " + row["LiteralValue"]);

OleDbSchemaGuid — что это? Здесь мы приоткрыли дверь в темное царство технологии COM. Я потратил на нее полтора года своей жизни, и очень об этом жалею. GUID — это globally unique ID, без множества которых не может существовать COM-объект. Одному COM-объекту требуется около дюжины GUID (их количество зависит от числа интерфейсов и их методов). Все они оседают в Windows-реестре, без которого также не может существовать COM-технология. На досуге просмотрите секцию HKEY_CLASSES_ROOT\CLSID реестра. Все эти ключи созданы при регистрации COM-объектов. Идентификаторы GUID пачками сидят и в других разделах реестра и поэтому реестр похож на помойку. Для сравнения, замечу, что .NET-компоненты не нуждаются в реестре, так как всю информацию о них можно получить из их кода (dll, или exe-файла) с помощью механизма рефлексии.

Упражнение. Добавьте кнопку btnShowBuilder на одну из панелей SplitContainer и в обработчик ее нажатия вставьте код, который иллюстрирует значения свойства ConflictOption класса OleDbCommandBuilder.

  void btnShowBuilder_Click(object sender, EventArgs e)

  {

   OleDbCommandBuilder b = new OleDbCommandBuilder(daStud);

   Form f = new Form();

   f.Width = 700;

   f.Height = 400;

   RichTextBox r = new RichTextBox();

   r.SelectionFont = new Font("Courier", 9);

   r.SelectionIndent = 15;

   f.Controls.Add(r);

   r.Dock = DockStyle.Fill;

   string s =

    GetCommandsText(b, b.ConflictOption = ConflictOption.OverwriteChanges) +

    GetCommandsText(b, b.ConflictOption = ConflictOption.CompareAllSearchableValues) +

    GetCommandsText(b, b.ConflictOption = ConflictOption.CompareRowVersion);

   r.SelectedText = s;

   f.ShowDialog();

  }

Вспомогательный метод GetCommandsText формирует строку с текстом всех трех комманд, генерируемых построителем. Этот текст поступает на вход компонента RichTextBox, который позволяет в более удобном виде (чем окно Output) просматривать текст (а также рисунки, и COM-объекты).

string GetCommandsText(OleDbCommandBuilder b, ConflictOption o)

  {

   return "\r\n" + o.ToString() + "\r\n\r\n" +

    b.GetDeleteCommand().CommandText + "\r\n" +

    b.GetInsertCommand().CommandText + "\r\n" +

    b.GetUpdateCommand().CommandText + "\r\n";

  }

Проверка функциональности

Запустите приложение и проверьте его способность вносить изменения в таблицу Studs базы Students.mdb. Заметьте, что при переходе в новую, пустую строку DataGridView заполняет все ячейки значением DBNull. Откройте испытуемую таблицу в Access и убедитесь, что изменения достигают цели. Рисунок иллюстрирует результат изменения данных (слева окно приложения, а справа окно Access). Другим способом убедиться, что мы действительно управляем данными, является закрытие и повторное открытие приложения (после внесения изменений).

 

Проверку функциональности проводите не торопясь, так как:

·  Процедура обмена данными требует некоторого времени, а OLE DB использует прослойку, называемую COM interoperability, и, конечно, саму модель COM — могучий тормоз, созданный людьми, угодившими в тупиковую ветвь эволюционного развития computer science.