Строки префикса и суффикса ("[", "]") я задал такими, потому, что видел их в коде, сгенерированном мастерами студии. Они работают, как в 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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.