Einzelnen Beitrag anzeigen

SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
317 Beiträge
 
Delphi 12 Athens
 
#1

id des soeben angelegten Datensatzes?

  Alt 21. Nov 2019, 16:01
Datenbank: MS-SQL • Version: Express2014 • Zugriff über: ADO
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?
  Mit Zitat antworten Zitat