|
Функции BatchOutput и BatchInput компонента TpFIBDataSet аналогичны соответствующим функциям компонента TpFIBQuery. Они также позволяют выполнить экспорт/импорт таблиц в бинарном и в текстовом формате. Однако для этих функций в компоненте TpFIBDataSet нет событий, аналогичных OnBatchError и OnBatching для TpFIBQuery.
В использовании этих функций есть один неприятный момент — в компоненте TpFIBDataSet и для экспорта, и для импорта данных используется оператор SQL, хранящийся в свойстве SelectSQL. Это создает некоторые неудобства при использовании такого набора данных. Впрочем, проблема решаема.
Создайте новый проект BatchQuery4:
Рис. 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.
FIBPlus - одна из лучших библиотек доступа к БД. Высокая скорость, надежность, устойчивость, удобство использования - вот далеко не полный перечень свойств, возвышающих этот продукт над аналогами. Хочу выразить особую благодарность за отличную поддержку пользователей. >>