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

Предыдущая часть

Функции BatchOutput и BatchInput компонента TpFIBDataSet


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

В использовании этих функций есть один неприятный момент — в компоненте TpFIBDataSet и для экспорта, и для импорта данных используется оператор SQL, хранящийся в свойстве SelectSQL. Это создает некоторые неудобства при использовании такого набора данных. Впрочем, проблема решаема.

Создайте новый проект BatchQuery4:

Рисунок 4

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

Экспорт таблиц

Для экспорта таблицы в бинарном формате выполняются следующие действия:

Delphi

procedure TFormBatch.BDSBatchOutputRClick(Sender: TObject);
var Str: TFIBOutputRawFile;
begin
if
OpenDialogOutRaw.Execute then
begin

Str := TFIBOutputRawFile.Create;
Str.Filename := OpenDialogOutRaw.FileName;
pFIBDataSet1.BatchOutput(Str);
Str.Destroy;
end;
end;

C++

void __fastcall TFormBatch::BDSBatchOutputRClick(TObject *Sender)
{
if (OpenDialogOutRaw->Execute())
{ TFIBOutputRawFile *Str;
Str = new TFIBOutputRawFile();
Str->Filename = OpenDialogOutRaw->FileName;
pFIBDataSet1->BatchOutput(Str);
delete Str;
}
}

Для экспорта таблицы в текстовом формате выполняются действия:

Delphi

procedure TFormBatch.BDSBatchOutputDClick(Sender: TObject);
var Str: TFIBOutputDelimitedFile;
begin
if
OpenDialogOutDel.Execute then
begin

Str := TFIBOutputDelimitedFile.Create;
Str.Filename := OpenDialogOutDel.FileName;
pFIBDataSet1.BatchOutput(Str);
Str.Destroy;
end;
end;

C++

void __fastcall TFormBatch::BDSBatchOutputDClick(TObject *Sender)
{
if (OpenDialogOutDel->Execute())
{ TFIBOutputDelimitedFile *Str;
Str = new TFIBOutputDelimitedFile();
Str->Filename = OpenDialogOutDel->FileName;
pFIBDataSet1->BatchOutput(Str);
delete Str;
}
}

Всё то же самое, что и в случае компонента TpFIBQuery. Здесь также можно использовать свойства RowDelimiter, ColDelimiter и OutputTitles.

Импорт таблиц

Для импорта таблицы в бинарном формате используется код:

Delphi

procedure TFormBatch.BDSBatchInputRClick(Sender: TObject);
var Str: TFIBInputRawFile;
begin
if not
OpenDialogInRaw.Execute then exit;
Str := TFIBInputRawFile.Create;
Str.Filename := OpenDialogInRaw.FileName;
pFIBDataSet1.Close;
pFIBDataSet1.SelectSQL.Clear;
pFIBDataSet1.SelectSQL.Add
('INSERT INTO PERSON(CODPERS, FIRST_NAME, LAST_NAME, COUNTRY)');
pFIBDataSet1.SelectSQL.Add
('VALUES(?CODPERS, ?FIRST_NAME, ?LAST_NAME, ?COUNTRY)');
pFIBDataSet1.BatchInput(Str);
pFIBTransaction1.CommitRetaining;
pFIBDataSet1.SelectSQL.Clear;
pFIBDataSet1.SelectSQL.Add
('SELECT CODPERS, FIRST_NAME, LAST_NAME, COUNTRY');
pFIBDataSet1.SelectSQL.Add
('FROM PERSON');
pFIBDataSet1.Open;
Str.Destroy;
end;

C++

void __fastcall TFormBatch::BDSBatchInputRClick(TObject *Sender)
{
if (!OpenDialogInRaw->Execute()) return;
TFIBInputRawFile *Str;
Str = new TFIBInputRawFile();
Str->Filename = OpenDialogInRaw->FileName;
pFIBDataSet1->Close();
pFIBDataSet1->SelectSQL->Clear();
pFIBDataSet1->SelectSQL->Add
("INSERT INTO PERSON(CODPERS, FIRST_NAME, LAST_NAME, COUNTRY)");
pFIBDataSet1->SelectSQL->Add
("VALUES(?CODPERS, ?FIRST_NAME, ?LAST_NAME, ?COUNTRY)");
pFIBDataSet1->BatchInput(Str);
pFIBTransaction1->CommitRetaining();
pFIBDataSet1->SelectSQL->Clear();
pFIBDataSet1->SelectSQL->Add
("SELECT CODPERS, FIRST_NAME, LAST_NAME, COUNTRY");
pFIBDataSet1->SelectSQL->Add
("FROM PERSON");
pFIBDataSet1->Open();
delete Str;
}

Для импорта таблицы в текстовом формате напишем код:

Delphi

procedure TFormBatch.BDSBatchInputDClick(Sender: TObject);
var Str: TFIBInputDelimitedFile;
begin
if not
OpenDialogInDel.Execute then exit;
Str := TFIBInputDelimitedFile.Create;
Str.Filename := OpenDialogInDel.FileName;
Str.SkipTitles := True;
pFIBDataSet1.Close;
pFIBDataSet1.SelectSQL.Clear;
pFIBDataSet1.SelectSQL.Add
('INSERT INTO PERSON(CODPERS, FIRST_NAME, LAST_NAME, COUNTRY)');
pFIBDataSet1.SelectSQL.Add
('VALUES(?CODPERS, ?FIRST_NAME, ?LAST_NAME, ?COUNTRY)');
pFIBDataSet1.BatchInput(Str);
pFIBTransaction1.CommitRetaining;
pFIBDataSet1.SelectSQL.Clear;
pFIBDataSet1.SelectSQL.Add
('SELECT CODPERS, FIRST_NAME, LAST_NAME, COUNTRY');
pFIBDataSet1.SelectSQL.Add
('FROM PERSON');
pFIBDataSet1.Open;
Str.Destroy;
end;

C++

void __fastcall TFormBatch::BDSBatchInputDClick(TObject *Sender)
{
if (!OpenDialogInDel->Execute()) return;
TFIBInputDelimitedFile *Str;
Str = new TFIBInputDelimitedFile();
Str->Filename = OpenDialogInDel->FileName;
Str->SkipTitles = true;
pFIBDataSet1->Close();
pFIBDataSet1->SelectSQL->Clear();
pFIBDataSet1->SelectSQL->Add
("INSERT INTO PERSON(CODPERS, FIRST_NAME, LAST_NAME, COUNTRY)");
pFIBDataSet1->SelectSQL->Add
("VALUES(?CODPERS, ?FIRST_NAME, ?LAST_NAME, ?COUNTRY)");
pFIBDataSet1->BatchInput(Str);
pFIBTransaction1->CommitRetaining();
pFIBDataSet1->SelectSQL->Clear();
pFIBDataSet1->SelectSQL->Add
("SELECT CODPERS, FIRST_NAME, LAST_NAME, COUNTRY");
pFIBDataSet1->SelectSQL->Add
("FROM PERSON");
pFIBDataSet1->Open();
delete Str;
}

Везде при импорте нам пришлось в свойство SelectSQL помещать оператор INSERT, а затем восстанавливать оператор SELECT.

Замечание. Данные в бинарном формате имеют одинаковую структуру, независимо от того, какими средствами эти данные были получены — при помощи методов компонента TpFIBQuery или компонента TpFIBDataSet.

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

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

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

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

FIBPlus - одна из лучших библиотек доступа к БД. Высокая скорость, надежность, устойчивость, удобство использования - вот далеко не полный перечень свойств, возвышающих этот продукт над аналогами. Хочу выразить особую благодарность за отличную поддержку пользователей. >>

Александр Алексишин, Web CEO Ltd.
Раздел для покупателей
Получение полных версий и обновлений. Перейти в Customer's Center

Сайт по Delphi: ежедневные ИТ-новости, статьи, документация, компоненты, конкурсы, юмор...