Hallo,
ich arbeite mich gerade in die Wissenschaft der Datenbanken ein. Ich habe hier
Microsoft SQL Server Express Edition (64-bit, Version 12.0.6108 SP3) zur Verfügung, Datenbank erstellte/beobachte ich mit dem
Microsoft SQL Server Management Studio.
Ich versuche seit Tagen die
id des soeben erfolgreich mit
Insert angelegtem Datensatz auszulesen.
Die
OH ist leider unverständlich für mich, aus verschiedenen Foren habe ich allerlei erfolglos versucht (ich sollte "allerlei" vielleicht beschreiben, da es aber zu nichts führte...
). Ich las, daß nach dem Insert der Zeiger auf dem Datensatz stünde - ja das ist fein, aber ich weiß trotzdem nicht, wie ich dann daraus die automatisch erstellte id ermittle (ADOQuery.recNo sagt 1 aber das ist nicht der Wert von id)!?
Wenn das Projekt fertig ist, werden ca. 10 Clients mitunter gleichzeitig Datensätze anlegen - folglich sollte ich nicht einfach die zuletzt generiert id auslesen, sondern diejenige, die ich gerade selbst generiert habe. Ich habe gelesen, daß die Datensätze clientbezogen angelegt werden und deshalb nichts durcheinander kommen kann - aber trotzdem kann ich ja nicht einfach fragen, welches ist die letzte id, denn die könnte ja 1 µs nach meiner id angelegt worden sein und bekomme dann die falsche id-Nummer... (bin mir da nicht sicher)
Mit einem nachfolgenden
db.ADOQuery.SQL.Text:='SELECT max(id) FROM tabelle';
und ExecSQL bzw. Open weiß ich aber nicht, wie/wo ich das Ergebnis lesen kann...
Für Euch sind das bestimmt Basics
ich lerne das aber erst
Vereinfacht dargestellt mache ich so das Insert (das auch funktioniert):
Delphi-Quellcode:
db.ADOQuery.paramCheck:=true;
db.ADOQuery.SQL.Text:='
INSERT into Tabelle (foo1,foo2,foo3) '+
'
Values (:foo1,:foo2,:foo3) ';
db.ADOQuery.Parameters.ParamByName('
foo1').Value:=s;
db.ADOQuery.Parameters.ParamByName('
foo2').Value:=strtoint(copy(s,3,2));
db.ADOQuery.Parameters.ParamByName('
foo3').Value:=strtoint(copy(s,1,2));
db.ADOQuery.ExecSQL;
Danach versuchte ich es zunächst mit
idstring:=db.ADOQuery['id'];
Die Fehlermeldung sagt aber nur "Das Feld 'id' wurde nicht gefunden" - ist aber sehr wohl in der Tabelle vorhanden als primary key.
Sowas wie
RETURN id
in die
SQL-Anfrage zu notieren, bringt mir einen anderen Fehler ein und geht auch nicht.
Ich vermute aber, ich muss nach dem ExecSQL noch was dazuschreiben...?
SELECT max(id) FROM tabelle
hilft mir auch nicht, weiß nicht wie ich das Ergebnis lese...
Oder wird in der ADOQuery-Komponente etwas automatisch aktualisiert, woraus ich die id ganz einfach auslesen kann?
Ich brauche die id, um diesen Datensatz in weiteren Datensätzen anderer Tabellen zu verknüpfen.
Ich habe auch noch ADOCommand, ADOTable, ADODataset, ADOConnection und Datasource zur Verfügung, die ich aber ohne Komponenten erst zu Laufzeit initialisiere und "verdrahte".
Gibt es vielleicht nach dem ExecSQL auch dort irgendwo eine Wertaktualisierung??
Was kann ich tun oder wie geht es bitte?