Hallo,
Ik heb hieronder een werkend voorbeeld van een thread die meerdere bitmaps aan een tabel toevoegd. Maar ik twijfel over de snelheid. Bij iedere regel die ik toevoeg moet ik de de Query Sluiten en Openen anders werkt het AutoInc field niet en krijg ik een foutmelding:
Project raised exception class EIBNativeException with message '[FireDAC][Phys][FB]OVERRIDING SYSTEM VALUE should be used to override the value of an identity column defined as 'GENERATED ALWAYS' in table/view tbl_ThumbNail'.
De foutmelding begrijp ik want ik heb een Identity Column aangemaakt met als eigenschap 'GENERATED ALWAYS' zodat Delphi geen eigen waardes kan posten voor de tnl_Id kolom.
Het probleem waar ik mee zit is: kan ik ook records toevoegen in een loop zonder voor ieder record een oQry.Close en oQry.Open te doen? Want ik denk dat dat veel tijd kost.
Code:
procedure TDBThread.Execute;
var
oConn: TFDConnection;
oQry: TFDQuery;
oBitmap: TBitmap;
oBlobField: TField;
oBlobStream: TStream;
i: Integer;
iBitmap: Integer;
begin
FreeOnTerminate := False;
oConn := TFDConnection.Create(nil);
oConn.ConnectionDefName := 'ThumbNails Pooled';
oQry := TFDQuery.Create(nil);
try
with oQry do
begin
CachedUpdates := True;
Connection := oConn;
SQL.Text := 'SELECT * FROM "tbl_ThumbNail"';
Open;
FieldDefs.Update;
Close;
for i := 0 to FieldDefs.Count - 1 do
begin
if FindField(FieldDefs[i].Name) = nil then
begin
FieldDefs.Items[i].CreateField(oQry);
end;
end;
FieldByName('tnl_Id').AutoGenerateValue := arAutoInc;
end;
for iBitmap := 0 to 5 do
begin
oqry.Close; //Kan dit anders?
oqry.Open; //Kan dit anders?
oQry.Insert;
oQry.FieldByName('tnl_orl_Id_OrginalLocation').Value := 1;
oBitmap := TBitmap.Create(500,100);
with oBitmap.Canvas do
begin
Font.Size := 20;
Font.Style := [fsbold];
Font.Color := clBlue;
TextOut(10,10,'Teller:'+IntToStr(iBitmap)+' ID:'+ IntToStr(ThreadID));
end;
oBlobField := oQry.FieldByName('tnl_jpg');
oBlobStream := oQry.CreateBlobStream(oBlobField, bmWrite);
oBitmap.SaveToStream(oBlobStream);
oBlobStream.Free;
oqry.ApplyUpdates;
end;
oqry.CommitUpdates;
finally
oQry.Free;
oConn.Free;
end;
end;
Dit is de aanroep
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
oThread1, oThread2: TDBThread;
begin
FDManager.Active := True;
oThread1 := TDBThread.Create(False);
oThread2 := TDBThread.Create(False);
oThread1.WaitFor;
oThread1.Free;
oThread2.WaitFor;
oThread2.Free;
end;
Voor de volledigheid nog de definitie:
Code:
procedure TForm1.FormCreate(Sender: TObject);
var
f : TField;
i : integer;
iCol : Integer;
iGridField: Integer;
oColumn: TColumn;
oDef: IFDStanConnectionDef;
begin
//Driver
with FDPhysFBDriverLink1 do
begin
DriverID := 'FB4Embedded'; //Eigen naam gekozen
Embedded := True;
ThreadSafe := True; //Geen documentatie hierover gevonden, toch op true gezet
VendorLib := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName))+'..\Firebird-4.0.1.2692-0-x64-pdb\fbclient.dll';
end;
// ConnectionDef
oDef := FDManager.ConnectionDefs.AddConnectionDef;
oDef.Params.Text := 'ExtendedMetadata=True';
oDef.Name := 'ThumbNails Pooled';
oDef.Params.Pooled := True;
oDef.Params.UserName := 'SYSDBA';
oDef.Params.Password := 'masterkey';
oDef.Params.Database := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName))+'..\FireBirdDB\DB_THUMBNAILS.FDB';
oDef.Params.DriverID := 'FB4Embedded';
// Connection
FDConnection1.ConnectionDefName := 'ThumbNails Pooled';
Bookmarks