Base de Conhecimento

Firedac Array DML

Introdução

Quantas vezes acontece que precisamos adicionar ou atualizar um grande número de registros na mesma tabela. Considere as importações onde isso acontece muito.

Firedac tem uma boa solução para isso chamado DML Array. Basicamente, em uma consulta você define sua declaração INSERT, UPDATE ou DELETE com parâmetros uma vez, então preencha os parâmetros como um array e então execute a consulta.

O array de parâmetros é enviado para o banco de dados junto com a consulta em um comando. As diferenças de desempenho de uma abordagem mais clássica são significativas. No Capítulo 15 do livro “Delphi in Depth: Firedac”, Cary Jensen discute o Array DML e seus detalhes técnicos. Neste cartão, a descrição de como aplicá-lo.

Exemplo de código

Primeiro defina sua consulta e parâmetros. Defina o tamanho da matriz de parâmetros para o número de itens que você deseja usar.

  Qry.SQL.Text:='INSERT INTO TABLE_TEST (ID, DESCRIPTION) VALUES (:ID,:DESCRIPTION)';
  Qry.ParamByName('ID').DataType := ftInteger;
  Qry.ParamByName('DESCRIPTION').DataType := ftString;
  
  Qry.Params.ArraySize := Descriptions.Count;

 

Usando Blobs

Foi necessário algum esforço para descobrir como isso funcionou com os campos BLOB. Nenhum exemplo disso pôde ser encontrado online e, portanto, o trecho de código abaixo. Primeiro defina o parâmetro para um campo BLOB.

Qry.ParamByName('BLOBFIELD').DataType:=ftStream;
Qry.ParamByName('BLOBFIELD').StreamMode:=smOpenWrite;

 
Neste exemplo, um registro Delphi é escrito no banco de dados como um campo binário. O seguinte código deve ser adicionado no laço onde os parâmetros são preenchidos.

ABlobStream := TMemoryStream.Create;
try
  APointer := @ARecord;
  ABlobStream.Write(APointer^, SizeOf(ARecord));

  ABlobStream.Position := 0;
  Qry.ParamByName('BLOBFIELD').LoadFromStream(ABlobStream, ftBlob, i);
finally
  ABlobStream.Free;
end;

Written by Kees de Kraker
Diretor

Contato

Deixe-nos ajudá-lo a realizar seus sonhos.