Exportando / Importando dados do FB / IB

Um dos assuntos mais procurados em fóruns e listas de discussões na área de desenvolvimento com banco de dados, sem dúvida é a exportação de dados entre tabelas do mesmo banco ou até mesmo entre bancos diferentes.

Mostrarei neste artigo como criar uma aplicação simples para importar / exportar dados do Firebird / InterBase, onde utilizaremos componentes da paleta InterBase do Delphi.

Crie uma nova aplicação no Delphi e coloque os seguintes componentes: um IBDatabase, um IBTransaction e um IBSQL. Vincule os componentes, conforme o diagrama da Figura 1. Nesse exemplo utilizaremos o banco Employee.fdb que acompanha a instalação do Firebird.

 

Figura 1. Ligação dos componentes de acesso a dados.

Coloque um BitBtn no formulário e adicione o seguinte código no evento OnClick:

var
  Output: TIBOutputRawFile;
begin
  IBSQL1.SQL.Text := 'select CUST_NO, CUSTOMER, CITY from CUSTOMER';
  Output := TIBOutputRawFile.Create;
 
try
    Output.Filename := 'C:\export.exp';
    IBSQL1.BatchOutput(Output);
 
finally
    Output.Free;
  end;
  ShowMessage('Exportação realizada com sucesso');
end;

A classe TIBOutputRawFile provê mecanismos para a exportação de arquivos, através da propriedade FileName, onde podemos especificar uma extensão (nesse caso salvamos como “*.exp”, mas poderíamos usar outro), e utilizamos o método BatchOutput para realizar a exportação. No IBSQL selecionamos os dados, através da instrução SQL apropriada. Rode a aplicação e faça a exportação dos dados.

Importando os dados

Vamos importar os dados do arquivo criado anteriormente (export.exp). Adicione mais dois BitBtns, um Edit e um OpenDialog. Acrescente o seguinte código no botão que irá localizar o arquivo de exportação:

if OpenDialog1.Execute then
  Edit1.Text := OpenDialog1.FileName;

Caso seja selecionado um arquivo no OpenDialog, atribuímos o caminho do arquivo na propriedade Text do Edit.

Você pode utilizar os mesmos componentes de acesso ao banco nesse exemplo, mas lembre-se de alterar o banco de destino. No botão de importação, adicione o seguinte código:

var
  Input: TIBInputRawFile;
begin
  IBSQL1.SQL.Text := 'insert into CUSTOMER values (:CUST_NO, :CUSTOMER, :CITY)';
  Input := TIBInputRawFile.Create;
 
try
    Input.Filename := Edit1.Text;
    IBSQL1.BatchInput(Input);
 
finally
    Input.Free;
  end;
  ShowMessage('Importação realizada com sucesso');
end;

Note que o código é praticamente o mesmo, diferenciando apenas a classe que trabalhara com a importação (TIBInputRawFile), a instrução SQL e o arquivo que esta na propriedade Text do Edit.

Aqui vale uma dica muito importante: para que a importação ocorra perfeitamente, os campos de destino têm que ter o mesmo nome, tipo de dados e ordem na tabela, caso contrário ocorrerá erros ao inserir os dados. Rode a aplicação e importe o arquivo gerado anteriormente (Figura 2).

 

Figura 2. Importando o arquivo com os dados.

Veja na Figura 3 os dados importados em uma tabela criada com a mesma estrutura da instrução SQL.


Figura 3. Dados importados em outro banco de dados.

Criando arquivos com delimitador (TAB)

Podemos utilizar um delimitador quando da exportação de dados, através da classe TIBInputDelimitedFile. A técnica utilizada nesse exemplo é praticamente igual a anterior, diferenciando é claro do código dos botões Exportar e Importar, como vemos a seguir:

Exportar

var

  Delimitador: TIBOutputDelimitedFile;
begin
  IBSQL1.SQL.Text := 'select CUST_NO, CUSTOMER, CITY from CUSTOMER';
  Delimitador := TIBOutputDelimitedFile.Create;
  try
    Delimitador.Filename := 'C:\export_delim.exp';
    IBSQL1.BatchOutput(Delimitador);
  finally
    Delimitador.Free;
  end;
  ShowMessage('Exportação realizada com sucesso');
end;
Importar
var
  Delimitador: TIBInputDelimitedFile;
begin
  IBSQL1.SQL.Text := 'insert into CUSTOMER values (:CUST_NO, :CUSTOMER, :CITY)';
  Delimitador := TIBInputDelimitedFile.Create;
  try
    Delimitador.Filename := Edit1.Text;
    IBSQL1.BatchInput(Delimitador);
  finally
    Delimitador.Free;
  end;
  ShowMessage('Importação realizada com sucesso');
end;

O delimitador padrão é o TAB, mas podemos alterar, através da propriedade ColDelimited. Como no código a seguir, onde alteramos o delimitador para ponto-e-vírgula (;):

Delimitador. ColDelimited := ' ; ';

Os testes realizados com ponto-e-vírgula não foram muito bons na importação dos dados, por isso recomendo utilizar o delimitador padrão (TAB). Veja na Figura 4, como fica o arquivo gerado pelo código de exportação com o delimitador.


Figura 4. Arquivo exportado utilizando TAB como delimitador.

Clique aqui para fazer o download do arquivo.