AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Bei Insert den neuen Index ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Bei Insert den neuen Index ermitteln

Ein Thema von Delbor · begonnen am 16. Nov 2021 · letzter Beitrag vom 16. Nov 2021
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Bei Insert den neuen Index ermitteln

  Alt 16. Nov 2021, 11:07
Datenbank: SQLite • Version: 3.xxx • Zugriff über: FireDac
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bei Insert den neuen Index ermitteln

  Alt 16. Nov 2021, 11:13
Ich mache das immer über die Methode GetLastAutoGenValue von TFDConnection.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Bei Insert den neuen Index ermitteln

  Alt 16. Nov 2021, 11:25
Hallo,
Select Max()
ist eine gaaanz schlechte Idee in einem Mehrbenutzer-System.
Es klappt allerdings bei jeder DB.

So was steht in einem Tutorial ???
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#4

AW: Bei Insert den neuen Index ermitteln

  Alt 16. Nov 2021, 12:22
Das steht da wirklich: https://docwiki.embarcadero.com/Code....SQLite_Sample
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#5

AW: Bei Insert den neuen Index ermitteln

  Alt 16. Nov 2021, 12:30
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.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Bei Insert den neuen Index ermitteln

  Alt 16. Nov 2021, 13:11
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...
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (16. Nov 2021 um 13:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 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