Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   LastRowID wie auslesen? (https://www.delphipraxis.net/181577-lastrowid-wie-auslesen.html)

p80286 27. Aug 2014 10:38

AW: LastRowID wie auslesen?
 
[QUOTE=AlexII;1269947]
Delphi-Quellcode:
    Form1.SQLQuery1.ParamByName('fk_category_id').AsInteger := Integer(CategoryComboBox.Items.Objects[CategoryComboBox.ItemIndex])
Das halte ich nicht für optimal. Die möglichen Werte für
Code:
fk_category_id
sollten aus der DB kommen und nicht aus Deinem Programm. Das kann gut gehen, dafür muß aber sicher gestellt werden, daß
Code:
fk_category_id
und
Delphi-Quellcode:
Integer(CategoryComboBox.Items.Objects[CategoryComboBox.ItemIndex])
immer gleich sind (für gleiche zugehörige Inhalte).

Null-Werte würde ich nicht über Parameter, sondern explizit übergeben:
Code:
 'INSERT INTO tbcategory VALUES(NULL, NULL)'
Gruß
K-H

AlexII 27. Aug 2014 11:12

AW: LastRowID wie auslesen?
 
Jah... da muss man sehr aufpassen, aber ich habe alles soweit logisch durchgespielt, es muss gehen. So lade ich die ComboBoxen:

Delphi-Quellcode:
  // Kategorie laden
  Form2.CategoryComboBox.Clear;
  Form2.CategoryComboBox.Items.AddObject(' ', TObject(0));
  SQLQuery1.Close;
  SQLQuery1.SQL.Text := 'SELECT id_tbcategory, category FROM tbcategory';
  SQLQuery1.Open;
  while not SQLQuery1.Eof do
  begin
    Form2.CategoryComboBox.Items.AddObject(SQLQuery1.FieldByName('category').AsString, TObject(SQLQuery1.FieldByName('id_tbcategory').AsInteger));
    SQLQuery1.Next;
  end;
Auch wenn in der ComboBox was gelöscht wird, kommen die IDs nicht durcheinander.

mkinzler 27. Aug 2014 11:57

AW: LastRowID wie auslesen?
 
Zitat:

Null-Werte würde ich nicht über Parameter, sondern explizit übergeben
Oder gleich weglassen
Statt
SQL-Code:
INSERT INTO tabelle VALUES( NULL, :Wert);
SQL-Code:
INSERT INTO tabelle Wert VALUES(:Wert);

DeddyH 27. Aug 2014 12:13

AW: LastRowID wie auslesen?
 
Dann musst Du aber auch die Felder angeben:
Delphi-Quellcode:
INSERT INTO tabelle(Feld1, Feld2) VALUES(:Wert1, :Wert2);

mse1 27. Aug 2014 15:35

AW: LastRowID wie auslesen?
 
Zitat:

Zitat von AlexII (Beitrag 1269947)
Zitat:

Zitat von himitsu (Beitrag 1269906)
Eventuell kennt das SQLQuery1 oder die Connection auch eine LastInsertRowId-Methode.

Da finde ich keine... habe das ganze in Lazarus mit ner SQLite DB.

Die Funktion heisst
Delphi-Quellcode:
TSQLite3Connection.GetInsertID().
Die MSEgui SQLdb Version schreibt die serverseitig generierten Werte übrigens automatisch in die Feldwerte zurück, entweder mittels "LASTINSERTID" für primary keys oder der "RETURNING" clause im SQL statement für beliebige Felder.

UliTs 25. Nov 2020 12:17

AW: LastRowID wie auslesen?
 
Ich habe ein ähnliches Problem, wenn ich mittels Insert / Post einen Datensatz anlege und RowId des neu angelegten Datensatzes bestimmen möchte:
Code:
FDQuery.Insert;
FDQuery.FieldByName( 'Name' ).value := 'Müller';
...
FDQuery.Post;

RowId := FDConnection.ExecSQLScalar( 'select top 1 LastRowId() LastRowId from Personen' );
Da kommt leider immer nur #0#0#0#0... heraus. Was mache ich falsch?

DeddyH 25. Nov 2020 12:20

AW: LastRowID wie auslesen?
 
Das sieht nach FireDAC aus, dann versuch mal:
Delphi-Quellcode:
FDConnection.GetLastAutoGenValue('');

UliTs 25. Nov 2020 19:04

AW: LastRowID wie auslesen?
 
Klappt leider nicht :( . NULL ist der Rückgabewert.

DeddyH 25. Nov 2020 19:14

AW: LastRowID wie auslesen?
 
Hat denn die Tabelle einen Primärschlüssel, der automatisch hochgezählt wird?

UliTs 25. Nov 2020 19:51

AW: LastRowID wie auslesen?
 
Nein, hat sie nicht. Das Problem ist, dass ich die Datenstruktur nicht so einfach ändern kann, da mit einem alten Programm noch mindestens 7 Monate (parallel über den Datenbankserver) darauf zugegriffen werden muß und das alte Programm äußerst empfindlich auf Änderungen in den Tabellen reagiert :shock: . Deshalb auch der Lösungsansatz über LastRowId() (es handelt sich um den Advantage DataBase Server).
Folgendes funktioniert:

Code:
cRowId := FDConnection.ExecSQLScalar(
'insert into TableName( Name ) values( ''Müller'' );'+
'select top 1 LastRowId() LastRowId from TableName' );
Nur ich brauche eine Lösung mittels FDQuery.Insert...FDQuery.Post und anschließend die RowId.
Vielleicht habe ich einen Fehler, wenn FDQuery.Post ausgeführt wird (da passiert noch einiges mehr) und dadurch die RowId nicht mehr verfügbar ist...
Mal sehen, was ich heute Nacht oder morgen noch hinbekomme 8-) .


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 Uhr.
Seite 2 von 3     12 3      

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