Количество показов: 2174
Опубликован: 2007-01-12 06:37:53
Автор:  Александр Бондарь

Введение

В процессе создания и использования приложений часто возникают вопросы, связанные с экспортом и импортом данных базы данных. Компоненты TpFIBQuery и TpFIBDataSet содержат группу методов, позволяющих осуществлять экспорт и импорт данных в двух форматах — бинарном и текстовом. Не существует встроенных методов для экспорта в форматы DBF и XML. Такие задачи можно легко решить при помощи дополнительных специализированных инструментов. Существует одно небольшое ограничение в этих методах — нельзя экспортировать поля Blob и массивы.

Использование встроенных операций экспорта/импорта позволит сделать ваш код проще и прозрачнее, поскольку нет нужды самостоятельно писать циклы «прохода» по результатам запроса и сохранения значений всех полей записи. При помощи FIBPlus вам нужно будет, фактически, только решить, в каком формате и в какой файл сохранять данные. В этой статье мы подробно продемонстрируем, как правильно использовать встроенные методы и какие особенности существуют при экспорте и импорте данных в определенном формате.

Необходимые методы содержат компоненты TpFIBQuery и TpFIBDataSet. Сначала рассмотрим использование методов компонента TpFIBQuery.

TpFIBQuery. Экспорт и импорт данных в бинарном формате

Как уже было сказано, данные могут выводиться в двух форматах — в бинарном (или «сыром», raw) и в текстовом (с разделителями, delimited) формате.

Методы BatchOutputRawFile и BatchInputRawFile компонента TpFIBQuery

Мы начнем с самых простых методов: BatchOutputRawFile и BatchInputRawFile компонента 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

Рис. 1. Проект BatchQuery1. Экспорт/импорт в бинарном формате

Свойство DBName компонента pFIBDatabase1 ссылается на базу данных FIBSAMPLE.GDB. Компонент pFIBDataSet1 использует таблицу PERSON. Оператор в его свойстве SelectSQL:

SELECT CODPERS,
FIRST_NAME,
LAST_NAME,
COUNTRY
FROM PERSON
Компонент pFIBDataSet1 нужен только для отображения текущего состояния таблицы PERSON, поэтому нам не потребуются другие операторы SQL у этого набора данных.

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.

Методы BatchOutput и BatchInput компонента TpFIBQuery

Функции BatchOutput и BatchInput позволяют выполнить экспорт/импорт данных как в бинарном, так и в текстовом форматах. Кроме того, объект TpFIBQuery содержит события, связанные с выполнением этих функций: OnBatchError и OnBatching.

Создайте в 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

Рис. 2. Проект BatchQuery2. Экспорт/импорт в бинарном формате

Характеристики компонентов работы с базой данных такие же, как и в первом примере.

Продолжение следует...

Специальные цены для ex-USSR (кроме стран ЕС):

235 Euro
1500 руб. для физ. лиц
3600 руб. для юр. лиц

Скидки при покупке нескольких копий!

Огромное спасибо!!! FIB+ rullezzz! >>

TO$HIK!
Раздел для покупателей
Получение полных версий и обновлений. Перейти в Customer's Center

Все об InterBase, Firebird и Yaffil. Новости, статьи, интервью, ссылки...