Привет всем дорогие друзья. В этой статье хочу поговорить о 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. Ну да, если кому-то интересно, то мое приложение выглядит очень просто:
Похожие записи
Метки: FireBird, InterBase, sql, база данных, БД
IBX годится для Firebird до тех пор, пока не возникнет желание использовать кодировку UTF8. Она имеет разный идентификатор в Firebird и InterBase, поэтому код IBX для FB придется править руками (но немного). См. «Ошибка Division by zero…» в
http://www.ibase.ru/unicode_faq.html
В качестве практики такой велосипед можно написать и я бы даже сказал нужно. Firebird замечательная СУБД и без написания таких вот программулек сложно понять принцип работы с ней. Но если серьезно, то лучше воспользоваться программой IBExpert. Эта незаменимая программа для создания/редактирования БД Interbase/Firebird. Там функция переноса таблиц из одной БД в другую является штатной. Причем думаю почти у каждого программиста, работающего с Firebird стоит данная программа. Если вы занялись изучением этой СУБД, то советую и вам установить ее. Не подумайте, это не реклама. Сам занимаюсь разработкой программ на огнептице. Кстати НУЖНО качать триалверсию, для русских она бесплатна. Удачи в освоении этой замечательной СУБД
Да, IbExpert мощная программа, но я вот решил побаловаться сам, так сказать, никогда не работал с Fibird, вообще никогда
Спасибо за советы!
Совместно с IBX удобно использовать бесплатный компонент IBUpdateSQLW, расположен: http://www.ibase.ru/fibc/wr_trans.txt
Это обеспечивает кеширование и последующую запись в рамках другой, пишущей транзакции. А читаешь в транзакции только для чтения.