![]() |
ADOQuery INSERT und Select
Hallo,
wie kann man ein INSERT und ein SELECT in einer Query unterbringen. Ich schreibe nämlich Daten in eine DB und möchte sofort danach den Autowert haben.
Code:
Jetzt will ich mit Select @@IDENTITY SOFORT (MS SQL Server 7.0) den Autowert haben.
ADOQUERY.close;
ADOQUERY.SQL.Clear; ADOQUERY.SQL.Add('INSERT INTO....'); ADOQUERY.EXECSQL; Hat jemand eine Idee ? Gruss Gunnar |
Re: ADOQuery INSERT und Select
Ich denke mal gar nicht. Du solltest nach den EXECSQL die Query wieder schließen und anschließend das Select reinschreiben.
|
Re: ADOQuery INSERT und Select
Hallo,
das hatte ich auch schon ausprobiert. Nach dem Einfügen des ersten DS kommt der Autowert zurück, nach dem einfügen eines weiteren DS gibt es eine Zugriffsverletzung. Gruss Gunnar |
Re: ADOQuery INSERT und Select
Verwe nde doch für den Insert-befehl TAdoCommand und nur für den Select TAdoQuery.
|
AW: ADOQuery INSERT und Select
Auch wenn dieser Thread schon sehr alt ist, möchte ich doch noch eine Lösung für das Problem posten. Denn ich hatte das selbe Problem und bin bei meiner Lösungssuche über diesen Thread gestolpert.
Delphi-Quellcode:
//INSERT-Anweisung
ADOQUERY.Close; ADOQUERY.SQL.Clear; ADOQUERY.SQL.Add('INSERT INTO....'); ADOQUERY.ExecSQL; //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; |
AW: ADOQuery INSERT und Select
Mal eine dumme Frage:
Du verwendest
Delphi-Quellcode:
warum nicht einfach
ADOQUERY.Close;
ADOQUERY.SQL.Clear; ADOQUERY.SQL.Add('INSERT INTO....'); ADOQUERY.ExecSQL;
Delphi-Quellcode:
Gruß
ADOQUERY.Close;
ADOQUERY.SQL.Text:='INSERT INTO....'; ADOQUERY.ExecSQL; K-H |
AW: ADOQuery INSERT und Select
Normalerweise gibt es sowas (frag nicht welcher/ob SQL ANSI Standard):
Code:
Unter MSSQL nennt sich das Returning aber 'Output' und geht etwas anders
insert into mytable (fieldlist) values (valuelist)
returning DerWertDermichInteressiert, DerAndereWert dann wäre es
Code:
Unter MSQSL 7 geht das aber glaube ich nicht!
insert into mytable (fieldlist)
OUTPUT DerWertDermichInteressiert, DerAndereWert values (valuelist) Dann gibt es noch
Code:
Vlt gabs das schon unter sql server 7.
SELECT SCOPE_IDENTITY()
|
AW: ADOQuery INSERT und Select
Ich hab mich nur an das vom Fragenden gegebenen Code-Beispiel gehalten...
|
AW: ADOQuery INSERT und Select
Zitat:
Man muss für die Insert Query dann irgendwie Out Parameter dran basteln, hab das irgendwie mal gemacht, aber weiß nur noch, dass es mangels Doku und KnowHow damals komisch war. Schau erstmal ob das überhaupt mit dem alten Datenbankserver geht, also zu Fuß per SQL Console. |
AW: ADOQuery INSERT und Select
Zitat:
Delphi-Quellcode:
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.
//Abfrage des Autowerts
ADOQUERY.Close; ADOQUERY.SQL.Text := 'SELECT @@IDENTITY AS ID'; ADOQUERY.Open; ID:=ADOQUERY.FIELDS[0].AsInteger; ADOQUERY.Close; 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz