Results 1 to 4 of 4

Thread: AutoInc field bij iedere iteratie Close en Open

  1. #1
    Senior Member
    Join Date
    Aug 2003
    Location
    Vlaardingen
    Posts
    102

    AutoInc field bij iedere iteratie Close en Open

    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';
    Last edited by ActiveS; 16-Jan-22 at 18:07.

  2. #2
    Senior Member
    Join Date
    Aug 2003
    Location
    Vlaardingen
    Posts
    102
    Het probleem is opgelost, ik heb oQry.ApplyUpdates; vervangen door oQry.Post.
    En oQry.CachedUpdates := True en de oQry.CommitUpdates weggehaald. Nu hoef ik niet bij iedere iteratie Close en Open te doen.

    Ik kwam erachter dat de error kwam bij de derde iteratie bij het ApplyUpdates commando. Waarschijnlijk is CachedUpdates niet zo slim in een thread, als iemand daar meer over kan zeggen dan hoor ik het graag.

    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;
          Prepare;
          oQry.Open;
        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;
          oQry.Post;
        end;
    
       // oqry.CommitUpdates;
        oqry.Unprepare;
      finally
        oQry.Free;
        oConn.Free;
      end;
    end;

  3. #3
    Gebruik je wel één connectie naar de DB per thread? Ik dacht trouwens ook dat de Firebird embedded variant slechts één connectie kon hebben, maar misschien vergis ik me/is mijn informatie niet up-to-date.

  4. #4
    Senior Member
    Join Date
    Aug 2003
    Location
    Vlaardingen
    Posts
    102
    Quote Originally Posted by luigi View Post
    Gebruik je wel één connectie naar de DB per thread? Ik dacht trouwens ook dat de Firebird embedded variant slechts één connectie kon hebben, maar misschien vergis ik me/is mijn informatie niet up-to-date.
    Ik heb hier wat links met informatie:

    Deze link omschrijft dat er in FireBird 4 sprake is van een connection pool

    https://firebirdsql.org/file/documen...onnection-pool

    Deze link omschrijft hoe je een multithreaded database connection kan maken. Hier heb ik mijn code op gebaseerd, de definitie van de connection staat niet in de thread (de connection is pooled en dan hoeft dat ook niet denk ik)

    https://docwiki.embarcadero.com/RADS...ding_(FireDAC)

    Ik wil nog wel een critical section gebruiken rondom de code in de thread om onverwachte problemen te voorkomen.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •