Как подключить Firebird в C# или «жарптица в решете»

Понедельник, Март 29th, 2010 | Программирование

1 звезда2 звезд3 звезд4 звезд5 звезд (11 голосов, средний: 4.55 из 5)
Loading ... Loading ...

У меня в институте на лабах активно используется СУБД Firebird, уж не знаю чем она так хороша. В основном, мне приходилось пользоваться этой СУБД через различные визуальные редакторы (по типу IBExpert, кстати не менее отвратное создание), позволяющие редактировать таблицы не окунаясь в дебри специфики Firebird’овского SQL.

Недавно мне пришлось поближе познакомиться с этой СУБД (в реальных проектах я бы ни за что на свете не стал ее использовать), но сами понимаете, лабы есть лабы и их надо делать :( .

Ладно, долю не конкретизированного негатива я выдал :) , пора бы по делу что-нибудь сказать.

В этой статье я подробно расскажу как подключить СУБД Firebird к программе написанной на C#.

Хочу сразу заметить, что на удивление капризный характер самой СУБД практически не сказался на способе ее подключения к C# программе.

Сервер СУБД Firebird представлен в двух ипостасях: серверная форма (возможно удаленное и локальное подключение) и в виде dll (так называемая, embedded версия – возможно только локальное подключение с указанием пути до файла *.FDB).

Для подключение к данной СУБД в программе на C# необходимо скачать NETProvider (выберите саму последнюю версию), он представляет из себя dll. Далее необходимо добавить эту библиотеку в качестве Reference к проекту в Microsoft Visual Studio. Теперь стало доступно пространство имен из библиотеки FirebirdSql.

Итак, дальше идут различия для двух «воплощений» Firebird: серверной и embedded.

Если вас интересует серверная, то скачать последнюю версию можно здесь (выберите под какой ОС хотите ее использовать, например если из под windows, то зайдите в папку firebird-win32 или firebird-win64 в зависимости от версии windows) имя файла будет выглядеть примерно так Firebird-*.*.*.*****_*_Win32_***_***.exe

Если вас интересует firebird embedded, то скачать последнюю версию можно здесь (выберите под какой ОС хотите ее использовать, например если из под windows, то зайдите в папку firebird-win32 или firebird-win64 в зависимости от версии windows) имя файла будет выглядеть примерно так Firebird-*.*.*.****-*_Win32_embed_***_***.zip

Далее к исходному коду добавляем:

using FirebirdSql.Data.FirebirdClient;
using FirebirdSql.Data.Isql;

Для подключения к СУБД необходимо создать класс FbConnection. В качестве параметра конструктора необходимо передать ConnectionString – строка, в которой задаются параметры соединения с БД. Для ее формирования можно воспользоваться классом FbConnectionStringBuilder.

Вот пример того как это можно сделать используя embedded версию СУБД:

FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
 
// Указываем тип используемого сервера
csb.ServerType = FbServerType.Embedded;
 
// Путь до файла с базой данных
csb.Database = "C:\\EMPLOYEE.FDB";
 
// Настройка параметров "общения" клиента с сервером
csb.Charset = "WIN1251";
csb.Dialect = 3;
 
// Путь до бибилиотеки-сервера Firebird
// Если библиотека находится в тойже папке
// что и exe фаил - указывать путь не надо
csb.ClientLibrary = @"dlls\fbembed.dll";
 
// Настройки аутентификации
csb.UserID = "SYSDBA";
csb.Password = "masterkey";

Следующим шагом является осуществление соединения с БД, делается это при помощи ранее упомянутого класса FbConnection (т.к. теперь есть ConnectionString, то можно подключиться к БД), делается это вот так:

// Создаем класс-соединения
// здесь csb.ToString() - сформированная строка соединения
using (FbConnection fbBD = new FbConnection(csb.ToString()))
{
    // открываем соединение
    fbBD.Open();
    ...
    // здесь находиться ваш код взаимодействия с БД
    ...
    // закрываем соеднинение с БД
    fbBD.Close();
}

Выполнение SQL запросов производиться через класс FbCommand, а в качестве разбора результата запроса можно использовать класс FbDataReader. Выглядит это следующим образом:

// Первый параметр - SQL запрос
// Второй параметр - ссылка на класс FbConnection
FbCommand sqlReqest = new FbCommand("select name, fio, tel from delivers",
                                    fbBD);
 
// Выполняем запрос
using (FbDataReader r = sqlReqest.ExecuteReader())
{
    // Читаем результат запроса построчно - строка за строкой
    while (r.Read())
    {
    	// Обращение к данным полей запроса осуществляется по их номеру в
    	// запросе, в данном случае 0 - name, 1 - fio, 2 - tel
    	string s = r.GetString(0) + " " + r.GetString(1) + r.GetString(2);
    }
}

Если вы собираетесь выполнять запросы изменяющие данные/структуру БД (запросы insert, delete, update, alter и т.д.), то вам придется использовать транзакции, реализуемые через класс FbTransaction. Создается он следующим образом:

// Здесь fbBD - объект типа FbConnection
FbTransaction transact = fbBD.BeginTransaction();


Все SQL запросы изменяющие содержимое БД должны выполнятся внутри транзакции, для того чтобы это сделать достаточно передать созданный класс транзакции в конструктор SQL запроса, делается это вот так:

// Здесь fbBD - класс FbConnection
// transact - класс транзакци FbTransaction
FbCommand sqlReqest = new FbCommand("delete from table1", fbBD, transact);

После того как вы внесете все изменения в БД вам необходимо их сохранить, для этого надо закрыть транзакцию (это надо сделать до закрытия соединения с БД), делается это так:

transact.Commit();

Подведем итог, общий вид приложения:

using FirebirdSql.Data.FirebirdClient;
using FirebirdSql.Data.Isql;
...
public void WorkWithBD()
{
   ...
   FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
   // Указываем тип используемого сервера
   csb.ServerType = FbServerType.Embedded;
 
   // Путь до файла с базой данных
   csb.Database = "C:\\EMPLOYEE.FDB";
 
   // Настройка параметров "общения" клиента с сервером
   csb.Charset = "WIN1251";
   csb.Dialect = 3;
 
   // Путь до бибилиотеки-сервера Firebird
   // Если библиотека находится в тойже папке
   // что и exe фаил - указывать путь не надо
   // Если используется не embedded - эта строчка не нужна
   csb.ClientLibrary = @"dlls\fbembed.dll";
 
   // Настройки аутентификации
   csb.UserID = "SYSDBA";
   csb.Password = "masterkey";
   ...
   // Создаем класс-соединения
   // здесь csb.ToString() - сформированная строка соединения
   using (FbConnection fbBD = new FbConnection(csb.ToString()))
   {
      // открываем соединение
      fbBD.Open();
      ...
      // Создаем транзакцию
      FbTransaction transact = fbBD.BeginTransaction();
      ...
      // Первый параметр - SQL запрос
      // Второй параметр - ссылка на класс FbConnection
      // Третий - транзакция
      FbCommand sqlReqest =
                    new FbCommand("select name, fio, tel from delivers",
                                  fbBD, transact);
 
      // Выполняем запрос
      using (FbDataReader r = sqlReqest.ExecuteReader())
      {
          // Читаем результат запроса построчно - строка за строкой
          while (r.Read())
          {
    	     // Обращение к данным полей запроса осуществляется по
             // их номеру в запросе, в данном случае
             // 0 - name, 1 - fio, 2 - tel
             string s = r.GetString(0)+" "+r.GetString(1)+r.GetString(2);
           }
      }
      ...
      // Подтверждаем транзакцию
      transact.Commit();
      ...
      // закрываем соеднинение с БД
      fbBD.Close();
   }
   ...
}

UPD. При подключении NetProvider’а для FireBird могут возникнуть ошибки совместимости версий .Net Framework. Это связано с тем что ваш проект и NetProvaider скомпилирован под разные версии famework’a. Чтобы избавить от данной ошибки, в настройках проекта укажите версию .Net Framework 3.5.

Данная статья – всего лишь ступенька, с которой вы сможете начать работу с СУБД Firebird.

Ряд полезных ссылок, из которых вы сможете почерпнуть не все, но многое:

  1. DotNetFirebird (Using Firebird SQL in .NET)
  2. Ветка форума: C# + Firebird

Удачи! ;)



Комментариев нет.

Оставить отзыв

Сначала зарегистрируйтесь.

Поиск по блогу