|
Использование встроенных операций экспорта/импорта позволит сделать ваш код проще и прозрачнее, поскольку нет нужды самостоятельно писать циклы «прохода» по результатам запроса и сохранения значений всех полей записи. При помощи FIBPlus вам нужно будет, фактически, только решить, в каком формате и в какой файл сохранять данные. В этой статье мы подробно продемонстрируем, как правильно использовать встроенные методы и какие особенности существуют при экспорте и импорте данных в определенном формате.
Необходимые методы содержат компоненты TpFIBQuery и TpFIBDataSet. Сначала рассмотрим использование методов компонента TpFIBQuery.
Для иллюстрации возьмем базу данных FIBSAMPLE.GDB, используемую в большинстве примеров по FIBPlus.
Создайте в Delphi или C++Builder новый проект BatchQuery1. Положите на форму следующие компоненты:
pFIBDatabase1: TpFIBDatabase;
pFIBTransaction1: TpFIBTransaction;
SelectQuery: TpFIBQuery;
InsertQuery: TpFIBQuery;
pFIBDataSet1: TpFIBDataSet;
OpenDialogOutRaw: TOpenDialog;
OpenDialogInRaw: TOpenDialog;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Panel1: TPanel;
BQueryBatchOutputRaw: TButton;
BQueryBatchInputRaw: TButton;
BDeleteAll: TButton;
Рис. 1. Проект BatchQuery1. Экспорт/импорт в бинарном формате
Свойство DBName компонента pFIBDatabase1 ссылается на базу данных FIBSAMPLE.GDB. Компонент pFIBDataSet1 использует таблицу PERSON. Оператор в его свойстве SelectSQL:
SELECT CODPERS,Компонент pFIBDataSet1 нужен только для отображения текущего состояния таблицы PERSON, поэтому нам не потребуются другие операторы SQL у этого набора данных.
FIRST_NAME,
LAST_NAME,
COUNTRY
FROM PERSON
SelectQuery и InsertQuery (TpFIBQuery) также необходимо подключить к pFIBDatabase1.
SelectQuery.SQL = pFIBDataSet1.SelectSQL, а InsertQuery.SQL имеет следующее значение:
INSERT INTO PERSON(
CODPERS,
FIRST_NAME,
LAST_NAME,
COUNTRY
)
VALUES(
?CODPERS,
?FIRST_NAME,
?LAST_NAME,
?COUNTRY
)
Компонент DataSource1 свяжите с pFIBDataSet1. Свойство DataSource у DBGrid1 установите в DataSource1. Компонент DBGrid1 отображает содержимое набора данных pFIBDataSet1.
Два компонента OpenDialog используются для открытия файлов при экспорте и импорте данных.
Для экспорта данных в бинарном формате с использованием метода BatchOutputRawFile напишите обработчик события щелчка по кнопке BQueryBatchOutputRaw.
Delphi
procedure TFormBatch.BQueryBatchOutputRawClick(Sender: TObject);
begin
if OpenDialogOutRaw.Execute then
begin
SelectQuery.Close;
SelectQuery.BatchOutputRawFile(OpenDialogOutRaw.FileName);
SelectQuery.Close;
end;
end;
C++
void __fastcall TFormBatch::BQueryBatchOutputRawClick(TObject *Sender)
{
if (OpenDialogOutRaw->Execute())
{ SelectQuery->Close();
SelectQuery->BatchOutputRawFile(OpenDialogOutRaw->FileName);
SelectQuery->Close();
}
}
Методу BatchOutputRawFile нужно передать только имя создаваемого файла и полный путь к этому файлу. В проекте для этого используется компонент OpenDialogOutRaw.
Для экспорта данных таблицы PERSON нужно щелкнуть по кнопке BQueryBatchOutputRaw, в диалоговом окне выбрать путь к файлу и ввести имя файла (по умолчанию расширение файла .BCR). Все данные, выбранные оператором SELECT компонента SelectQuery, будут записаны в указанный файл. Разумеется, можно экспортировать не все строки таблицы, а только часть их, указав в операторе SELECT фразу WHERE, ограничивающую количество выбранных записей.
Для импорта данных в бинарном формате с использованием метода BatchInputRawFile используем следующий обработчик события щелчка по кнопке BQueryBatchInputRaw.
Delphi
procedure TFormBatch.BQueryBatchInputRawClick(Sender: TObject);
begin
if OpenDialogInRaw.Execute then
begin
InsertQuery.BatchInputRawFile(OpenDialogInRaw.FileName);
pFIBTransaction1.CommitRetaining;
pFIBDataSet1.FullRefresh;
end;
end;
C++
void __fastcall TFormBatch::BQueryBatchInputRawClick(TObject *Sender)
{
if (OpenDialogInRaw->Execute())
{ InsertQuery->BatchInputRawFile(OpenDialogInRaw->FileName);
pFIBTransaction1->CommitRetaining();
pFIBDataSet1->FullRefresh();
}
}
Методу BatchInputRawFile также нужно передать только имя файла. Для каждой записи будет выполняться оператор SQL компонента InsertQuery, который будет помещать записи в базу данных.
Здесь важно завершить транзакцию (Commit или CommitRetaining). Если этого не сделать, то дальнейшая попытка удалить введенные записи (см. ниже) не даст никакого результата, поскольку метод Execute работает с внутренней транзакцией, для которой будут невидимы введенные записи.
Прежде чем восстановить данные скопированной таблицы необходимо удалить все записи из таблицы PERSON. Иначе возникнет ошибка дублирования первичного ключа. Напишите следующий обработчик события щелчка по кнопке BDeleteAll:
Delphi
pFIBDatabase1.Execute('DELETE FROM PERSON');
pFIBDataSet1.FullRefresh;
C++
pFIBDatabase1->Execute("DELETE FROM PERSON");
pFIBDataSet1->FullRefresh();
Метод Execute компонента TpFIBDatabase позволяет выполнить одиночный оператор SQL, который не возвращает значений. В нашем случае оператор SQL удаляет все записи из таблицы PERSON.
Создайте в Delphi или C++Builder еще один проект — BatchQuery2. Положите на форму следующие компоненты:
pFIBDatabase1: TpFIBDatabase;
pFIBTransaction1: TpFIBTransaction;
pFIBDataSet1: TpFIBDataSet;
SelectQuery: TpFIBQuery;
InsertQuery: TpFIBQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Panel1: TPanel;
BQueryBatchOutputR: TButton;
BQueryBatchInputR: TButton;
BDeleteAll: TButton;
OpenDialogOutRaw: TOpenDialog;
OpenDialogInRaw: TOpenDialog;
Рис. 2. Проект BatchQuery2. Экспорт/импорт в бинарном формате
Характеристики компонентов работы с базой данных такие же, как и в первом примере.