Kennisbank

Firedac Array DML

Introductie

Hoe vaak gebeurt het niet dat er grote aantallen records in dezelfde tabel moeten worden toegevoegd of bijgewerkt. Denk bijvoorbeeld aan imports waarbij dit veel voorkomt.

Firedac heeft hier een mooie oplossing voor, namelijk Array DML. In een query definieer je eenmalig een INSERT, UPDATE of DELETE statement met parameters. Je vult vervolgens de parameters als een array en voert dan de query uit.

De array van parameters wordt samen met de query in één commando naar de database gestuurd. De performanceverschillen ten opzichte van een klassieke aanpak zijn significant. In hoofdstuk 15 van het boek “Delphi in Depth: Firedac” bespreekt Cary Jensen Array DML en de technische details ervan. In deze blog wordt praktisch beschreven hoe het kan worden toegepast.

Code voorbeeld

Definieer eerst de query en de parameters. Stel de grootte van de parameter array in voor het aantal items dat je wilt gebruiken.

  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;

 
Loop vervolgens door de data, vul de paramater array en voer de query uit:

  var i := 0;
  for var Item in Descriptions do
  begin
    Qry.ParamByName('ID').AsIntegers[i] := Item.ID;
    Qry.ParamByName('DESCRIPTION').AsStrings[i] := Item.Description;

    Inc(i);
  end;
  
  Qry.Execute(Qry.Params.ArraySize);

 

Gebruiken met Blobs

Het kostte enige moeite om uit te vinden hoe dit werkte met BLOB-velden. Online was er geen goed voorbeeld van te vinden en daarom het onderstaande codevoorbeeld. Definieer als eerste de parameter voor een BLOB-veld.

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

 
In dit voorbeeld wordt een Delphi record als binair veld naar de database geschreven. Deze code moet worden toegevoegd in de loop waarin de parameters worden gevuld.

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;

Geschreven door Kees de Kraker
Directeur

Contact

Laat ons helpen jouw ambities concreet te maken.