DDL запросы. CREATE/ALTER/DROP
Данный вид запросов позволяет управлять метаданными БД. Вы можете создавать, удалять и модифицировать колонки, таблицы и целые базы данных через SQL выражения, в тексте которых содержатся DDL-инструкции. Если применять их совместно со схемами метаданных, то можно без особых усилий копировать структуры существующих баз данных и создавать новые.
Все DDL запросы, за исключением CREATE DATABASE и DROP DATABASE, могут выполняться как в режиме автоматического подтверждения, так и в контексте транзакции. По умолчанию фиксирование изменений произведенных DDL запросами отключено. Это сделано из соображений безопасности. Для того, чтобы включить подтверждение DDL запросов, необходимо установить свойство auto_commit_ddl. Его описание есть в разделе «Методы подключения к базе данных» этой статьи.
Приведу пример использования DROP DATABASE для удаления базы данных:
private void 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 провайдеров других производителей.
Теперь DDL для создания новой базы данных:
private OleDbConnection CreateDatabase() { //подключение к существующей бд employee.gdb
OleDbConnection con = ConnectionProvider.CreateConnection(); con.Open();
//создание новой базы данных
new OleDbCommand( "create database '" + server_name + ":" + databasePath + "'\n" + "USER '" + user_name + "' \n" + "PASSWORD '" + password + "' \n", con).ExecuteNonQuery();
con.Close();
return new OleDbConnection( CreateConnectionStringBuilderForSample().ToString()); }
И, наконец, законченный пример, который сначала удаляет базу данных, потом создает на её месте новую и определяет в ней две таблицы, связанные внешним ключом:
public void 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(); }