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.
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);
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;
Contact