Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADOQuery INSERT und Select (https://www.delphipraxis.net/6681-adoquery-insert-und-select.html)

lemmond1976 18. Jul 2003 11:20


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:
ADOQUERY.close;
ADOQUERY.SQL.Clear;
ADOQUERY.SQL.Add('INSERT INTO....');
ADOQUERY.EXECSQL;
Jetzt will ich mit Select @@IDENTITY SOFORT (MS SQL Server 7.0) den Autowert haben.

Hat jemand eine Idee ?

Gruss
Gunnar

r_kerber 18. Jul 2003 11:27

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.

lemmond1976 18. Jul 2003 11:34

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

r_kerber 18. Jul 2003 11:41

Re: ADOQuery INSERT und Select
 
Verwe nde doch für den Insert-befehl TAdoCommand und nur für den Select TAdoQuery.

Nico B. 24. Feb 2017 10:58

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;

p80286 24. Feb 2017 11:48

AW: ADOQuery INSERT und Select
 
Mal eine dumme Frage:
Du verwendest
Delphi-Quellcode:
 ADOQUERY.Close;
 ADOQUERY.SQL.Clear;
 ADOQUERY.SQL.Add('INSERT INTO....');
 ADOQUERY.ExecSQL;
warum nicht einfach
Delphi-Quellcode:
 ADOQUERY.Close;
 ADOQUERY.SQL.Text:='INSERT INTO....';
 ADOQUERY.ExecSQL;
Gruß
K-H

jobo 24. Feb 2017 11:59

AW: ADOQuery INSERT und Select
 
Normalerweise gibt es sowas (frag nicht welcher/ob SQL ANSI Standard):
Code:
insert into mytable (fieldlist) values (valuelist)
returning DerWertDermichInteressiert, DerAndereWert
Unter MSSQL nennt sich das Returning aber 'Output' und geht etwas anders
dann wäre es
Code:
insert into mytable (fieldlist)
OUTPUT DerWertDermichInteressiert, DerAndereWert
values (valuelist)
Unter MSQSL 7 geht das aber glaube ich nicht!

Dann gibt es noch
Code:
SELECT SCOPE_IDENTITY()
Vlt gabs das schon unter sql server 7.

Nico B. 24. Feb 2017 11:59

AW: ADOQuery INSERT und Select
 
Ich hab mich nur an das vom Fragenden gegebenen Code-Beispiel gehalten...

jobo 24. Feb 2017 12:12

AW: ADOQuery INSERT und Select
 
Zitat:

Zitat von jobo (Beitrag 1362511)
Normalerweise gibt es sowas ..

Nachtrag:
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.

nahpets 24. Feb 2017 13:15

AW: ADOQuery INSERT und Select
 
Zitat:

Zitat von Nico B. (Beitrag 1362503)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr.
Seite 1 von 2  1 2      

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