Delphi-Quellcode:
//Abfrage des Autowerts
ADOQUERY.Close;
ADOQUERY.SQL.Clear;
ADOQUERY.SQL.Add('SELECT @@IDENTITY AS ID');
ADOQUERY.ExecSQL;
ADOQUERY.Open;
ADOQUERY.First;
ID:=ADOQUERY.FIELDBYNAME('ID').AsInteger;
Das lässt sich auch vereinfachen:
Delphi-Quellcode:
//Abfrage des Autowerts
ADOQUERY.Close;
ADOQUERY.SQL.Text := 'SELECT @@IDENTITY AS ID';
ADOQUERY.Open;
ID:=ADOQUERY.FIELDS[0].AsInteger;
ADOQUERY.Close;
Mit ExecSQL wird das Statement ausgeführt, wenn man auch keine Ergebnismenge erhält und mit Open wird es ein zweites Mal ausgeführt. Auf ExecSQL kann man hier also durchaus verzichten. Bei einem Datensatz als Ergebnis mag das laufzeittechnisch nicht von Belang sein, bei einer größeren Ergebnismenge aber durchaus.
Und fragt man auf diese Weise eine Sequenz ab, wird das Ergbebnis für den nächsten Wert immer doppelt so hoch vom vorherigen entfernt sein, wie die Schrittweite der Sequenz, sprich: Man überspringt einen Wert.
Nach dem Open ist man auf dem ersten Datensatz, man muss also nicht nochmal extra mit First auf den ersten Datensatz gehen.
Da wir nur eine Spalte in der Ergebnismenge haben, können wir die auch direkt abgreifen, statt sie erst per FieldByName zu suchen. Das "AS ID" könnte man sich daher sparen.
Und am Ende, wenn das Ergebnis abgeholt wurde, wird die Datenmenge wieder geschlossen. Sie muss nicht bis zur nächsten Benutzung offen bleiben.
Und damit lässt sich das Ganze wunderbar in 'ner Funktion kapseln.