|
Компонент TpFIBQuery содержит еще один полезный метод — BatchToQuery. Он дает возможность поместить результат выполнения одного запроса в таблицу при помощи другого запроса. Наиболее подходящий вариант использования этого метода — перемещение данных из одной базы данных в другую. Метод позволяет работать с полями Blob и массивами.
Скопируем нашу базу данных FIBSAMPLE.GDB в тот же каталог с другим именем: FIBSAMPLE2.GDB.
Создайте новый проект BatchQuery5.
Рис. 5. Проект BatchQuery5. Копирование данных в другую базу данных
Положите на форму несколько новых компонентов:
pFIBDatabase2: TpFIBDatabase;
pFIBTransaction2: TpFIBTransaction;
pFIBDataSet2: TpFIBDataSet;
QueryToAnotherBase: TpFIBQuery;
BBatchToQuery: TButton;
BDeleteFromAnotherBase: TButton;
DataSource2: TDataSource;
DBGrid2: TDBGrid;
Свойство DBName компонента pFIBDatabase2 ссылается на базу данных FIBSAMPLE2.GDB. Компонент pFIBDataSet2 использует ту же таблицу PERSON. DBGrid2 в нижней части формы отображает содержимое таблицы PERSON во второй базе данных.
Щелчок по кнопке DeleteFromAnotherBase удаляет все записи из таблицы PERSON во второй базе данных.
Обработчик события щелчка по кнопке BatchToQuery выполняет перезапись содержимого запроса во вторую базу данных:
Delphi
procedure TFormBatch.BBatchToQueryClick(Sender: TObject);
var SL: TStringList;
begin
SL := TStringList.Create;
SL.Clear;
SL.Add('CODPERS=CODPERS');
SL.Add('FIRST_NAME=FIRST_NAME');
SL.Add('LAST_NAME=LAST_NAME');
SL.Add('COUNTRY=COUNTRY');
SelectQuery.BatchToQuery(QueryToAnotherBase, SL);
SL.Free;
SelectQuery.Close;
pFIBTransaction2.CommitRetaining;
pFIBDataSet2.FullRefresh;
end;
C++
void __fastcall TFormBatch::BBatchToQueryClick(TObject *Sender)Здесь мы вызываем метод BatchToQuery компонента SelectQuery. SelectQuery выбирает все записи таблицы PERSON из первой базы данных. Методу BatchToQuery передается в первом параметре имя другого компонента TpFIBQuery, QueryToAnotherBase, который содержит оператор INSERT для записи данных в таблицу PERSON во вторую базу данных. Его свойство SQL:
{
TStringList *SL;
SL = new TStringList();
SL->Clear();
SL->Add("CODPERS=CODPERS");
SL->Add("FIRST_NAME=FIRST_NAME");
SL->Add("LAST_NAME=LAST_NAME");
SL->Add("COUNTRY=COUNTRY");
SelectQuery->BatchToQuery(QueryToAnotherBase, SL);
delete SL;
SelectQuery->Close();
pFIBTransaction2->CommitRetaining();
pFIBDataSet2->FullRefresh();
}
INSERT INTO PERSON(
CODPERS,
FIRST_NAME,
LAST_NAME,
COUNTRY
)
VALUES(
?CODPERS,
?FIRST_NAME,
?LAST_NAME,
?COUNTRY
)
Второй параметр, передаваемый методу BatchToQuery, является объектом типа TStringList, каждая строка которого содержит конструкцию следующего вида:
Имя_параметра_другого_запроса=Имя_поля_текущего_запросаНаш параметр SL будет содержать четыре строки:
CODPERS=CODPERS
FIRST_NAME=FIRST_NAME
LAST_NAME=LAST_NAME
COUNTRY=COUNTRY
Меня поражает как в них [FIBPlus] все хорошо продумано. И приятно, что это сделали русские программисты. >>