Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Bei Insert den neuen Index ermitteln (https://www.delphipraxis.net/209256-bei-insert-den-neuen-index-ermitteln.html)

Delbor 16. Nov 2021 10:07

Datenbank: SQLite • Version: 3.xxx • Zugriff über: FireDac

Bei Insert den neuen Index ermitteln
 
Hi zusammen

Nachdem das erstellen einer nicht vorhandenen Datenbank nun klappt, geht es nun darum, die Datenbank auch zu füllen. Das ist, so hoffe ich, kein grösseres Problem - ich kann da auf SQL-Statements als Muster zurückgreifen, die ich mal für eine Bilddatenbank erstellt habe. Denoch sich da eine Frage:
1 : Delphi liefert ein Tutorial für SQLite Namens GettingStartet:
Delphi-Quellcode:
procedure TfrmGettingStarted.btnInsertClick(Sender: TObject);
var
  iID: Integer;
begin
  if not dbMain.Connected then
    Exit;
  // Insert a record
  dbMain.ExecSQL('insert into Categories(CategoryName, Description, Picture) ' +
                 'values(:N, :D, :P)', ['New category', 'New description', $0334]);
  qryCategories.Refresh;

  // Get a scalar value from DB
  iID := dbMain.ExecSQLScalar('select MAX(CategoryID) from Categories');
  sbMain.SimpleText := 'Last CategoryID = ' + IntToStr(iID);
end;

Frage: Die aktuelle ID eines gerade eingefügten Datensatzes ermittelte ich in meiner Bild-DB so:
Delphi-Quellcode:
function TCMSQLiteModul.BildInsertQuery(BJpeg: TJPEGImage; WorkMap : TBitmap; LIdFolder: String): integer;
  var SQLString: string;               //  BJpeg,
begin
  SQLString := 'Insert Into tbl_bild(Thumbnail, Bitmap, FolderID) Values (:Thumbnail, :Bitmap, :FolderID)';
  FDSQLiteQuery.SQL.Text := SQLString;
  FDSQLiteQuery.ParamByName('Thumbnail').assign(BJpeg);              //  FDSQLiteQuery.Params[0].Assign(Bjpeg); // := ;
  FDSQLiteQuery.ParamByName('Bitmap').Assign(Workmap);;              //  FDSQLiteQuery.Params[1].Assign(Workmap);
  FDSQLiteQuery.ParamByName('FolderID').AsString := LIDFolder;      //  FDSQLiteQuery.Params[2].AsString := LIDFolder;
  FDSQLiteQuery.ExecSQL(false);
  if FDSQLiteQuery.Active then
     FDSQLiteQuery.Close;
  SQLString := 'SELECT LAST_INSERT_ROWID() AS LastID';  
  FDSQLiteQuery.SQL.Text := SQLString;
  FDSQLiteQuery.Open;                                            // Den aktuellen Index für den neuen Datensatz ermitteln
  if not FDSQLiteQuery.IsEmpty then
    result := FDSQLiteQuery.FieldByName('LastID').AsInteger;     // und an result übergeben
end;
Hat sich das inzwischen geändert, oder ist das eine weitere Möglichkeit?

Gruss
Delbor

DeddyH 16. Nov 2021 10:13

AW: Bei Insert den neuen Index ermitteln
 
Ich mache das immer über die Methode GetLastAutoGenValue von TFDConnection.

hoika 16. Nov 2021 10:25

AW: Bei Insert den neuen Index ermitteln
 
Hallo,
Select Max()
ist eine gaaanz schlechte Idee in einem Mehrbenutzer-System.
Es klappt allerdings bei jeder DB.

So was steht in einem Tutorial ???

DeddyH 16. Nov 2021 11:22

AW: Bei Insert den neuen Index ermitteln
 
Das steht da wirklich: https://docwiki.embarcadero.com/Code....SQLite_Sample

BerndS 16. Nov 2021 11:30

AW: Bei Insert den neuen Index ermitteln
 
Innerhalb einer Transaktion sollte das Max() doch keine Probleme machen.
Andere Benutzer sollten den Datensatz vor einem Commit nicht sehen und man selber die Inserts anderer ebenfalls nicht.

Zumindest, wenn man davon ausgeht, das sich das bei sqlite so verhält, wie z.B. Interbase/Firebird.

Delbor 16. Nov 2021 12:11

AW: Bei Insert den neuen Index ermitteln
 
Hi DeddyH

Vielen Dank für deine Antwort! Soweit ich mich zurückerinnere, hab ich seinerzeit die Empfehlung von der SQL-Seite angewendet, und da sind FireDac-Lösungen natürlich unbekannt.

Gruss
Delbor

PS:
Wobei SQLite, auch wenn es teilweise auch in wenig frequentierten Webseiten angewendet wird, grundsätzlich kein Mehrbenutzersystem ist...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz