FireBird-ServerПривет всем дорогие друзья. В этой статье хочу поговорить о FireBird. Мне, если честно, никогда не доводилось работать с данной СУБД, поэтому для меня это было что-то новое. Я сначала начал думать о том, через что мне лучше всего подключаться к моей базе данных: ADO – подумал я, можно было бы попробовать, как я подключался к MySQL подключиться через ODBC, но я почему-то не захотел, а просто сказал себе, зачем, если в Delphi есть замечательная вкладка InterBase, которая поможет решить все мои проблемы.

Задача передо мной стояла очень простая, мне необходимо было из одной базы данных, перенести данные в другую базу данных. Структуры базы данных у меня одинаковые, так что придумать задачу еще легче, наверное, нельзя.

Установил я FireBird 1.5 Server и положил себе в папку 2 базы *.FDB.

Далее я создал проект в Delphi и установил на форме следующие компоненты:

  • TIBDataBase – 2 шт
  • TIBQuery – 2 шт
  • TIBTable – 1 шт
  • TDataSource – 1 шт
  • TDBGrid – 1 шт
  • TIBTransaction – 1 шт
  • TButton – 7 шт
  • TComboBox – 1 шт

Количество кнопок я установил по своему желанию (для подключения, для выбора базы, для просмотра содержимого таблицы и так далее). Естественно, все компоненты для работы с БД я устанавливал с вкладки InterBase.

Компонент TComboBox необходим мне для отображения списка таблиц первой базы данных, из которой я буду переносить данные в другую БД.

Что касается связки компонентов между собой. Компоненты TIBDataBase я связал с TIBTransaction в свойстве DefaultTransaction, компоненты TIBQuery и TIBTable я связал с TIBDataBase в свойстве DataBase, компонент TDataSource я связал с TIBQuery (с нужным мне) в свойстве DataSet, а компонент TDataSource я связал TDBGrid в свойстве DataSource. Тут должно быть все понятно, все стандартно.

Также свойство LoginPromt, компонента TIBDataBase, необходимо установить в False, чтобы не появлялось сообщение для ввода пароля и пользователя, а свойстве Params, компонента TIBDataBase, необходимо задать параметры подключения (логин и пароль), по умолчанию, они будут:

  • user_name=SYSDBA
  • password=masterkey

После того, как все у нас подготовлено, нам необходимо подключиться к нашей БД. Для этого на событие OnClick кнопки выбора пути к БД я написал следующий код:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
   try
    if OpenDialog1.Execute then
     begin
      Edit1.Text:='localhost:'+OpenDialog1.FileName;
     end;
   except
    on e:Exception do
   end;
end;

Как видите, вначале строки подключения, я указываю ip адрес сервера, на котором размещена моя база данных, в моем случае она размещена локально, соответственно я и указал «localhost:».

То есть, строка подключения должна быть похожа, примерно на это:

localhost:D:\РАБОЧАЯ ПАПКА\СС\CC\Base\Base.FDB

Ту же самую операцию я проделал и по отношению к другой базе данных. По нажатию на кнопку подключиться, я подключаюсь сразу к двум базам данных одновременно, если к какой-то базе не удалось подключиться, то вывожу об этом соответствующее сообщение.

Итак, на событие OnClick, кнопки, по которой происходит подключение к БД я написал следующий код:

procedure TForm1.Button2Click(Sender: TObject);
var
 i:integer;
begin
   try
    IBDatabase1.DatabaseName:=Edit1.Text;
    IBDatabase1.Connected:=True;
    IBDatabase2.DatabaseName:=Edit2.Text;
    IBDatabase2.Connected:=True;
    Application.MessageBox('Подключение прошло успешно','Внимание',MB_OK+MB_ICONINFORMATION);
    IBTransaction1.Active:=True;
    ComboBox1.Items:=IBTable1.TableNames;
    ComboBox1.ItemIndex:=0;
   except
    on e:Exception do
     Application.MessageBox('Ошибка подключения к одной из БД','Внимание',MB_OK+MB_ICONERROR);
   end;
end;

Как видно из данного кода, в TComboBox я получаю список таблиц из компонента TIBTable. По началу я хотел это организовать при помощи запроса, но у меня, почему не получилось вывести весь список таблиц моей БД, только часть получал и еще с системными таблицами. А это довольно простой способ, который у меня используется.

Ну что, теперь можно приступать к переносу данных из одних таблиц в другие, но для начала я организовал просмотр данных в таблицах первой базы данных. Это делается очень просто, данные выводятся в компонент TDBGrid по нажатию на кнопку. Данные запрашиваю при помощи обычного SQL-запроса. Давайте теперь посмотрим, как это делается. На событие OnClick кнопки я написал следующий код:

procedure TForm1.Button1Click(Sender: TObject);
begin
   try
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add('SELECT * FROM '+ComboBox1.Items[ComboBox1.ItemIndex]);
    IBQuery1.Active:=True;
    Form1.Height:=246;
    DBGrid1.Visible:=True;
   except
    on e:Exception do
     Application.MessageBox('Ошибка просмотра таблицы','Внимание',MB_OK+MB_ICONERROR);
   end;
end;

Таблица выбираю из списка TComboBox и делаю запрос в нее, затем данные из таблицы отображаются в компоненте TDBGrid. Для того, чтобы перенести данные из одной базы данных в другое, необходимо на событие OnClick кнопки написать следующий код:

procedure TForm1.Button4Click(Sender: TObject);
var
 i:integer;
begin
   try
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add('SELECT * FROM '+ComboBox1.Items[ComboBox1.ItemIndex]);
    IBQuery1.Active:=True;
    IBQuery1.First;
    IBQuery2.SQL.Clear;
    IBQuery2.SQL.Add('DELETE FROM '+ComboBox1.Items[ComboBox1.ItemIndex]);
    IBQuery2.Active:=True;
    IBTable2.TableName:=ComboBox1.Items[ComboBox1.ItemIndex];
    IBTable2.Active:=True;
    while not IBQuery1.Eof do
     begin
      IBTable2.Insert;
      for i:=0 to IBQuery1.FieldCount-1 do
       begin
        IBTable2.Fields[i].Value:=IBQuery1.Fields[i].Value;
       end;
       IBTable2.Post;
       IBQuery1.Next;
     end;
    Application.MessageBox('Все данные перенесены','Внимание',MB_OK+MB_ICONINFORMATION);
   except
    on e:Exception do
     Application.MessageBox('Не удается перенести данные','Внимание',MB_OK+MB_ICONERROR);
   end;
end;

Тут все тоже очень просто. Вначале я получаю данные, с помощью запроса, из первой базы данных, затем я очищаю таблицу (вдруг она не пустая) из другой базы данных и затем добавляю новые значения. Все просто. Если у Вам необходимо перенести данные из одной таблицы в другую идентичную, в пределах одной базы данных, то это можно организовать все, при помощи обычного SQL-запроса, например:

INSERT INTO Table1 SELECT * FROM Table2

Кстати, хочу заметить также, что когда я запустил свое приложение, оно у меня не подключалось, к моим базам данных. Я не понял в чем проблема: проверил еще раз все настройки подключения, проверил, работает ли сервер, все было в порядке. Но затем, я полез в службы, и в них был запущен сервис InterBase, я его отключил, как все стало работать, я даже не знал, что данная служба у меня установлена, видимо, необходима была для работы какой-то программы.

Вот и все, ничего, возможно, нового я Вам не рассказал, но просто, чтобы знали, что вкладка InterBase, вполне неплохая, для работы с FireBird и InterBase. Ну да, если кому-то интересно, то мое приложение выглядит очень просто:

Perenos-iz-odnoi-bd-v-druguy

Метки: , , , ,




К записи “Работа с FireBird в Delphi” оставлено комментариев: 4.

  1. kdv:

    IBX годится для Firebird до тех пор, пока не возникнет желание использовать кодировку UTF8. Она имеет разный идентификатор в Firebird и InterBase, поэтому код IBX для FB придется править руками (но немного). См. «Ошибка Division by zero…» в
    http://www.ibase.ru/unicode_faq.html

  2. В качестве практики такой велосипед можно написать и я бы даже сказал нужно. Firebird замечательная СУБД и без написания таких вот программулек сложно понять принцип работы с ней. Но если серьезно, то лучше воспользоваться программой IBExpert. Эта незаменимая программа для создания/редактирования БД Interbase/Firebird. Там функция переноса таблиц из одной БД в другую является штатной. Причем думаю почти у каждого программиста, работающего с Firebird стоит данная программа. Если вы занялись изучением этой СУБД, то советую и вам установить ее. Не подумайте, это не реклама. Сам занимаюсь разработкой программ на огнептице. Кстати НУЖНО качать триалверсию, для русских она бесплатна. Удачи в освоении этой замечательной СУБД ;)

    • Andrey:

      Да, IbExpert мощная программа, но я вот решил побаловаться сам, так сказать, никогда не работал с Fibird, вообще никогда

      Спасибо за советы!

  3. rv:

    Совместно с IBX удобно использовать бесплатный компонент IBUpdateSQLW, расположен: http://www.ibase.ru/fibc/wr_trans.txt
    Это обеспечивает кеширование и последующую запись в рамках другой, пишущей транзакции. А читаешь в транзакции только для чтения.

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*