![]() |
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 ![]()
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:
Hat sich das inzwischen geändert, oder ist das eine weitere Möglichkeit?
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; Gruss Delbor |
AW: Bei Insert den neuen Index ermitteln
Ich mache das immer über die Methode GetLastAutoGenValue von TFDConnection.
|
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 ??? |
AW: Bei Insert den neuen Index ermitteln
Das steht da wirklich:
![]() |
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. |
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 08:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz