Keywords: Visual Studio 2008, VS 2005, DDL запросы, схемы метаданных, Firebird ODBC Escape Sequences, InterBase ODBC, Firebird ADO .Net провайдер, C#, работа с InterBase, подключение к InterBase
Схемы метаданных БД.
Неотъемлемой частью всех Ole Db провайдеров являются схемы метаданных. Они используются клиентами
для получения описания базы данных: списка хранимых процедур, структур таблиц, зарегистрированных доменов, ограничений,
первичных и внешних ключей и т.д. Для того чтобы Ole Db провайдер смог работать с библиотекой ADO .Net он должен поддерживать Ole Db схемы,
так как компоненты библиотеки активно используют эту информацию.
Запросить определенную схему можно по её названию. Для этого у объекта OleDbConnection есть метод GetSchema().
В Net 2 появился метод GetOleDbSchema(), который в качестве аргумента принимает одно из значений OleDbSchemaGuid.
Оба этих метода ведут себя одинаково и возвращают абсолютно идентичные экземпляры DataTable с набором информации по схеме.
У каждой схемы есть набор колонок, по которым можно отфильтровать возвращаемый результат. Например, в схеме COLUMNS
можно наложить ограничения по следующим полям:
Restriction columns: TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME.
Если мы хотим получить описание всех колонок для таблицы EMPLOYEE мы должны использовать схему COLUMNS следующим образом:
Данный вид запросов позволяет управлять метаданными БД. Вы можете создавать, удалять и модифицировать колонки,
таблицы и целые базы данных через SQL выражения, в тексте которых содержатся DDL инструкции.
Если применять их совместно со схемами метаданных, то можно без особых усилий копировать структуры существующих баз данных и создавать новые.
Все DDL запросы, за исключением CREATE DATABASE и DROP DATABASE, могут выполняться как в режиме
автоматического подтверждения, так и в контексте транзакции. По умолчанию фиксирование изменений произведенных
DDL запросами отключено. Это сделано из соображений безопасности. Для того чтобы включить подтверждение DDL запросов необходимо
установить свойство auto_commit_ddl. Его описание есть в разделе «Методы подключения к базе данных» этой статьи.
Приведу пример использования DROP DATABASE для удаления базы данных:
privatevoid DropDatabase()
{
if (File.Exists(databasePath))
{
OleDbConnectionStringBuilder builder =
CreateConnectionStringBuilderForSample();
//отключаем использование пула для этого подключения
builder.OleDbServices = OleDbServicesValues.EnableAll &
~OleDbServicesValues.ResourcePooling;
OleDbConnection con = new OleDbConnection(builder.ToString());
con.Open();
new OleDbCommand(«drop database»,con).ExecuteNonQuery();
con.Close();
}
}
Обратите внимание на то, что для подключения, которое будет использоваться для удаления базы данных,
мы отключили использование пула ресурсов. IBProvider умеет информировать сервисы Ole Db о,
ставших недоступными, подключениях и в данном случае это действие является избыточным. Но данный код оставлен здесь для решения возможных
проблем при использовании Ole Db провайдеров других производителей.
И, наконец, законченный пример, который сначала удаляет базу данных, потом создает на её месте новую и определяет в ней две таблицы,
связанные внешним ключом:
publicvoid CreateNewDBSample()
{
DropDatabase();
OleDbConnection con = CreateDatabase();
con.Open();
OleDbTransaction trans = con.BeginTransaction();
//создаем таблицу SAMPLE_TABLE с двумя колонками
ExecuteDDL(
«CREATE TABLE SAMPLE_TABLE( « + //int column » ID INTEGER NOT NULL, « + //varchar column» NAME VARCHAR(64), « + //primary key«CONSTRAINT PK_SAMPLE_TABLE PRIMARY KEY(ID) )», trans);
//создаем SAMPLE_TABLE_2 связанную через FOREIGN KEY
ExecuteDDL(
«CREATE TABLE SAMPLE_TABLE_2 ( « +
» ID INTEGER NOT NULL, « + //int columns» PARENT INTEGER NOT NULL, « + //int column«CONSTRAINT PK_SAMPLE_TABLE_2 PRIMARY KEY(ID), « + //primary key«CONSTRAINT FK_SAMPLE_TABLE_PARENT « + //foreign key«FOREIGN KEY(PARENT) REFERENCES SAMPLE_TABLE(ID))», trans);
trans.Commit();
con.Close();
}
В последних версия IBProvider.3 появилась возможность создания базы даннных без промежуточного подключения к БД.
Управляющие последовательности позволяют преобразовывать текст запроса в процессе выполнения.
Последовательность включается в текст запроса в фигурных скобках. Например {fn CURDATE} —
выражение будет преобразовано в значение серверного времени.
В ODBC определены управляющие последовательности для следующих характеристик:
Работа со временем и датами
Функции преобразования типов
Предикат LIKE
OUTER JOIN
Вызовы хранимых процедур
Данное расширение активно используется такими инструментами как MS SQL Server, Business Intelligence, Crystal Reports,
и их поддержка со стороны Ole Db провайдера обеспечивает возможность их совместного использования.
Кроме того, оно позволяет писать запросы,
которые не зависят от базы данных. Управляющие последовательности есть в MS SQL, Oracle и многих других серверах БД.
Для того чтобы включить поддержку ODBC расширений в IBProvider,
необходимо установить свойство инициализации support_odbc_query = true. По умолчанию поддержка отключена.
Более подробной информацию об управляющих последовательностях ODBC, поддерживаемых функциях вы найдете в
Справочнике управляющих последовательностей ODBC.
Следующий пример демонстрирует применение управляющих последовательностей в тексте SQL запросов:
publicvoid ODBCQueriesTest()
{
OleDbConnectionStringBuilder builder =
ConnectionProvider.GetConnectionStringBuilderFromUDL();
builder.Provider = «LCPI.IBProvider.2»;
builder.Add(«support_odbc_query»,«true»);
OleDbConnection con = new OleDbConnection(builder.ToString());
con.Open();
OleDbTransaction trans = con.BeginTransaction();
//select current day name
OleDbCommand cmd = new OleDbCommand(
«select « +
«{fn dayname({fn now()})} as DAY_NAME,» +
«{fn dayofweek({fn now()})} as DAY_OF_WEEK,» +
«{fn dayofmonth({fn now()})} as DAY_OF_MONTH,» +
«{fn dayofyear({fn now()})} as DAY_OF_YEAR « +
«from RDB$DATABASE», con, trans);
using (OleDbDataReader rdr = cmd.ExecuteReader())
if (rdr.Read())
for (int i = 0; i < rdr.FieldCount; i++)
Console.WriteLine(rdr.GetName(i) + «: « + rdr[i].ToString());
trans.Commit();
con.Close();
}
Заключение
В своем обзоре я рассмотрел наиболее часто используемые возможности библиотеки ADO .Net на примере OLE DB провайдера.
Основное преимущество OLE DB провайдеров перед управляемыми (.Net Data Providers) — это возможность их использования
не только в среде .Net Framework, а практически в любых средах поддерживающих COM.
Использование IBProvider в качестве поставщика данных Firebird и InterBase позволяет:
Обмениваться данными с приложениями Microsoft Office (включая Access и Outlook) и использовать VBA (Visual Basic for Applications)
Писать расширенные сценарии автоматизации при помощи WSH (Windows Script Host), VBScript, Java Script
Разрабатывать WEB-приложения, WEB-сервисы c базами данных не только на ASP.Net, но и на ASP
Производить анализ данных при помощи OLAP средств, разрабатывать отчетные системы при помощи средств Business Intelligence (SSAS, SSRS).
Использовать провайдер в составе распределенных транзакций.
IBProvider поддерживает все существующие версии InterBase/Yaffil/Firebird.
Имеет встроенный менеджер управления памятью и SWAP для пользовательских данных.
Поддерживает многопоточность, а так же серверные и клиентские курсоры. Осуществляет многоязыковую поддержку.
Надеюсь, данное руководство позволит вам расширить круг применяемых возможностей ADO .Net не только для работы с Firebird и InterBase,
но и с другими базами данных.
М.Фаулер. Архитектура корпоративных программных приложений. Изд. Москва — Спб — Киев. 2004 г.
Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. Изд. Питер. 2006 г.
А. Ковязин, С.Востриков. Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/Firebird/Yaffil (+ CD-ROM). Изд. КУДИЦ-Образ, Питер. 2005 г.