Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADOQuery SQL Parameter keine Übergabe (https://www.delphipraxis.net/158895-adoquery-sql-parameter-keine-uebergabe.html)

daredd 7. Mär 2011 11:21

Datenbank: ACCESS • Version: 2003 • Zugriff über: ADO

ADOQuery SQL Parameter keine Übergabe
 
Hallo Peopz,

kann mir einer weiterhelfen. Ich versuche mit einer ADOQuery eine Tabelle zu füllen:
Delphi-Quellcode:
procedure TForm2.New_Warenbestand(table1, table2: TADOTable); //Neuer Artikel in Warenbestand (KOMSA)
var
i :Integer;
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Warenbestand(products_id, external_id, permission_id, products_owner, products_ean, products_quantity, products_average_quantity,'
+'products_shippingtime, products_model, products_master_model, products_master_flag, products_option_template, products_option_list_template,'
+'products_sort, products_image, products_price, date_added, last_modified, date_available, products_weight, products_status, products_tax_class_id,'
+'product_template, product_list_template, manufacturers_id, products_ordered, products_transactions, products_fsk18, products_vpe, products_vpe_status,'
+'products_vpe_value, products_startpage, products_startpage_sort, products_average_rating, products_rating_count, products_digital,'
+'products_serials, categories, products_description_de, products_name_de, products_short_description_de, url_text_de, meta_title_de, meta_keywords_de,'
+'meta_description_de, products_description_en, products_name_en, products_short_description_en, url_text_en, meta_title_en, meta_keywords_en, meta_description_en)');
ADOQuery1.SQL.Add('VALUES(:products_id, :external_id, :permission_id, :products_owner, :products_ean, :products_quantity, :products_average_quantity,'
+':products_shippingtime, :products_model, :products_master_model, :products_master_flag, :products_option_template, :products_option_list_template,'
+':products_sort, :products_image, :products_price, :date_added, :last_modified, :date_available, :products_weight, :products_status, :products_tax_class_id,'
+':product_template, :product_list_template, :manufacturers_id, :products_ordered, :products_transactions, :products_fsk18, :products_vpe, :products_vpe_status,'
+':products_vpe_value, :products_startpage, :products_startpage_sort, :products_average_rating, :products_rating_count, :products_digital,'
+':products_serials, :categories, :products_description_de, :products_name_de, :products_short_description_de, :url_text_de, :meta_title_de, :meta_keywords_de,'
+':meta_description_de, :products_description_en, :products_name_en, :products_short_description_en, :url_text_en, :meta_title_en, :meta_keywords_en, :meta_description_en)');
i := TableStepBack(table2);
ADOQuery1.Parameters.ParamByName('products_id').Value := i; //hier übergebe ich einen Wert, aber der Debugger mekkat! 
ADOQuery1.Parameters.ParamByName('external_id').Value := table1.FieldByName('ARTIKELNUMMER').AsString;
ADOQuery1.Parameters.ParamByName('permission_id').Value := '0';
ADOQuery1.Parameters.ParamByName('products_owner').Value := '1';
.
.
.
ADOQuery1.ExecSQL;
ADOQuery1.Active := true;
end;
Und bei ADOQuery1.Active sagt mir der Debugger:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt DatenZugriff.exe ist eine Exception der Klasse EOleException mit der Meldung 'Sie müssen einen Wert in das Feld 'Warenbestand.products_id' eingeben' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Obwohl ich einen Wert an 'products_id' übergeben, nämlich i. Was ist hier faul?

DeddyH 7. Mär 2011 11:27

AW: ADOQuery SQL Parameter keine Übergabe
 
Und was "mekkat" der Compiler? Außerdem: entweder Active auf true oder Open/ExecSQL, aber nicht beides.

Sir Rufo 7. Mär 2011 11:29

AW: ADOQuery SQL Parameter keine Übergabe
 
Dieses SQL-Statement liefert doch keine Daten zurück.
Es wird ausgeführt (der Name lässt es ja auch schon vermuten) mit
Delphi-Quellcode:
ExecSQL
Ein
Delphi-Quellcode:
Active := True
ist dabei unsinnig und falsch, weil nun das Statement nochmals ausgeführt wird und ein ResultSet erwartet wird, was es aber nicht gibt.
Ist auf der Spalte
Code:
products_id
auch noch ein Unique-Index dann rummst es dort auch noch.

Kontrollier doch mal die DB, denn die Werte sollten dann drinstehen (wenn es erst nach dem ExecSQL knallt)

daredd 7. Mär 2011 11:30

AW: ADOQuery SQL Parameter keine Übergabe
 
Danke für den Tipp, wie gesagt ich bekomme die Meldung:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt DatenZugriff.exe ist eine Exception der Klasse EOleException mit der Meldung 'Sie müssen einen Wert in das Feld 'Warenbestand.products_id' eingeben' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Der Compiler meckert nicht.

Sir Rufo 7. Mär 2011 11:33

AW: ADOQuery SQL Parameter keine Übergabe
 
Es lohnt sich übrigens immer ein Blick in die Online-Hilfe

DeddyH 7. Mär 2011 11:33

AW: ADOQuery SQL Parameter keine Übergabe
 
Hast Du die "Active"-Zeile denn jetzt rausgenommen?

daredd 7. Mär 2011 11:35

AW: ADOQuery SQL Parameter keine Übergabe
 
Zitat:

Zitat von Sir Rufo (Beitrag 1086415)
Dieses SQL-Statement liefert doch keine Daten zurück.
Es wird ausgeführt (der Name lässt es ja auch schon vermuten) mit
Delphi-Quellcode:
ExecSQL
Ein
Delphi-Quellcode:
Active := True
ist dabei unsinnig und falsch, weil nun das Statement nochmals ausgeführt wird und ein ResultSet erwartet wird, was es aber nicht gibt.
Ist auf der Spalte
Code:
products_id
auch noch ein Unique-Index dann rummst es dort auch noch.

Kontrollier doch mal die DB, denn die Werte sollten dann drinstehen (wenn es erst nach dem ExecSQL knallt)

Ja, die Spalte products_id ist ein Unique-Index! Ich habe ADOQuery1.Active := true, entfernt und arbeite nur noch mit einem ExecSQL, trotzdem kommt die Meldung:' Wert für products_id fehlt...'

DeddyH 7. Mär 2011 11:37

AW: ADOQuery SQL Parameter keine Übergabe
 
Handelt es sich um einen Autowert? Den müsstest Du gar nicht übergeben.

daredd 7. Mär 2011 11:51

AW: ADOQuery SQL Parameter keine Übergabe
 
Also, leider wird der Wert nicht automatisch übergeben. Es ist in Access definiert 'Eindeutig', vorher war auch noch 'Ist erforderlich', das hab ich mal weggenommen und nun kommt folgende Meldung:
'Nullwert in Index oder Primär-Schlüssel nicht möglich'

Wie kann ich den eine automatische Wert setzen, habt das ganze mit eine Variable gelöst (i), die wird so ermittelt:

Delphi-Quellcode:
function TableStepBack(table :TADOTable) :Integer;  //ID-nummer Ermitteln
var
s :Integer;
begin
  table.Last;
  Result := table.FieldByName('products_id').AsInteger + 1;
end;

DeddyH 7. Mär 2011 12:07

AW: ADOQuery SQL Parameter keine Übergabe
 
Damit das überhaupt funktionieren kann, muss die Tabelle auf jeden Fall aktuell und nach der ID sortiert sein.

daredd 7. Mär 2011 12:10

AW: ADOQuery SQL Parameter keine Übergabe
 
Also, ich habe das mit dem 'products_id' hab ich gelöst. Hab in Access die Spalte als AutoWert definiert. Nun arbeitet das Query, aber ausser der products_id wird nichts in die Tabelle geschrieben.

Jumpy 7. Mär 2011 12:18

AW: ADOQuery SQL Parameter keine Übergabe
 
Ich nehme mal an, du hast auch das SQL-Statement angepasst und die products_ID rausgenommen?

Generell mal gefragt, wieso arbeitest du/man mit den Parametern? Mach man das so? Hätte man nicht einfach die Werte direkt beim Zusammenbaues des SQL-Statements da reinschreiben können?

daredd 7. Mär 2011 12:22

AW: ADOQuery SQL Parameter keine Übergabe
 
ja, die products_id ist aus dem sql raus:
Delphi-Quellcode:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Warenbestand(external_id, permission_id, products_owner, products_ean, products_quantity, products_average_quantity,'
+'products_shippingtime, products_model, products_master_model, products_master_flag, products_option_template, products_option_list_template,'
+'products_sort, products_image, products_price, date_added, last_modified, date_available, products_weight, products_status, products_tax_class_id,'
+'product_template, product_list_template, manufacturers_id, products_ordered, products_transactions, products_fsk18, products_vpe, products_vpe_status,'
+'products_vpe_value, products_startpage, products_startpage_sort, products_average_rating, products_rating_count, products_digital,'
+'products_serials, categories, products_description_de, products_name_de, products_short_description_de, url_text_de, meta_title_de, meta_keywords_de,'
+'meta_description_de, products_description_en, products_name_en, products_short_description_en, url_text_en, meta_title_en, meta_keywords_en, meta_description_en)');
ADOQuery1.SQL.Add('VALUES(:external_id, :permission_id, :products_owner, :products_ean, :products_quantity, :products_average_quantity,'
+':products_shippingtime, :products_model, :products_master_model, :products_master_flag, :products_option_template, :products_option_list_template,'
+':products_sort, :products_image, :products_price, :date_added, :last_modified, :date_available, :products_weight, :products_status, :products_tax_class_id,'
+':product_template, :product_list_template, :manufacturers_id, :products_ordered, :products_transactions, :products_fsk18, :products_vpe, :products_vpe_status,'
+':products_vpe_value, :products_startpage, :products_startpage_sort, :products_average_rating, :products_rating_count, :products_digital,'
+':products_serials, :categories, :products_description_de, :products_name_de, :products_short_description_de, :url_text_de, :meta_title_de, :meta_keywords_de,'
+':meta_description_de, :products_description_en, :products_name_en, :products_short_description_en, :url_text_en, :meta_title_en, :meta_keywords_en, :meta_description_en)');
Keine ahnung, hab das so gelernt. Ich muss werte aus einer anderen Tabelle kopieren, die nicht identisch ist mit der Tabelle 'Warenbestand'.

daredd 7. Mär 2011 12:49

AW: ADOQuery SQL Parameter keine Übergabe
 
Hat keiner mehr eine Idee, warum die VALUES in die Tabelle nicht übergeben werden?
... ich probiere das ganze nun mit ADOTable zu lösen.

DeddyH 7. Mär 2011 13:03

AW: ADOQuery SQL Parameter keine Übergabe
 
Zum Kopieren von Daten könnte man sich auch einmal die INSERT INTO ... SELECT FROM-Syntax anschauen, das dürfte ggf. einfacher werden als dieses Monsterkonstrukt.

Sir Rufo 7. Mär 2011 13:15

AW: ADOQuery SQL Parameter keine Übergabe
 
Zitat:

Zitat von Jumpy (Beitrag 1086452)
Generell mal gefragt, wieso arbeitest du/man mit den Parametern? Mach man das so? Hätte man nicht einfach die Werte direkt beim Zusammenbaues des SQL-Statements da reinschreiben können?

:shock: Um Himmels willen nicht direkt reinbauen

Stichwort: SQL-Injection und Performance (um nur 2 zu nennen)

Ich vermute jetzt mal, dass die Verbindung der Parameter-Liste nicht so richtig passt.

Erzeuge auf der Form ein TADOQuery mit dem SQL-Statement und prüfe über den OI die Parameter.
Dann benutzt du genau diese Query in deiner Procedure, füllst die Parameter und lass die dann mal ausführen.

Und DeddyH hat auch recht, wenn alle Daten schon in der DB vorhanden sind, macht es keinen Sinn diese erst zum CLient zu holen und dann wieder zurück zur DB zu schicken. Das geht dann auch direkt in der DB

daredd 7. Mär 2011 13:17

AW: ADOQuery SQL Parameter keine Übergabe
 
schau ich mir mal an, ich probiers jetzt erstmal step_by_step... erstmal nur eine spalte in der Tabelle auffüllen und wenn das klappt, sehen wir weiter ;)

@Jumpy: danke für den tipp, probiere ich gleich danach aus!

DeddyH 7. Mär 2011 13:18

AW: ADOQuery SQL Parameter keine Übergabe
 
Probier das lieber nicht aus, siehe Sir Rufos Post.

daredd 7. Mär 2011 13:22

AW: ADOQuery SQL Parameter keine Übergabe
 
sorry ich meinte auch sirRufos ))

daredd 7. Mär 2011 13:28

AW: ADOQuery SQL Parameter keine Übergabe
 
Also das funktioniert schon mal:

Delphi-Quellcode:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Warenbestand(external_id)');
ADOQuery1.SQL.Add('SELECT ARTIKELNUMMER FROM Tabelle2');
ADOQuery1.ExecSQL;
ABER VOLL LANGSAM! Ich habe 8000 Datensätze ))

DeddyH 7. Mär 2011 13:30

AW: ADOQuery SQL Parameter keine Übergabe
 
Wie oft führst Du das denn aus? Auf diese Weise müsstest Du 8000 neue DS erzeugt haben.

daredd 7. Mär 2011 13:36

AW: ADOQuery SQL Parameter keine Übergabe
 
Nein, ich habe mich geirrt. Ist alles super schnell. Es war das DBGrid bzw. hatte ich noch ein Tabelle2.Next irgendwo eingebaut...

Noch eine Frage, mittlerweile sind meine AutoWerte (products_id) in der Tabelle schon bei 16000, kommt durch das ständige herrumprobieren. Wie kann ich den AutoWert wieder bei 0 oder 1 Starten?

DeddyH 7. Mär 2011 13:55

AW: ADOQuery SQL Parameter keine Übergabe
 
Tut mir leid, bei Access muss ich leider passen.

Sir Rufo 7. Mär 2011 13:59

AW: ADOQuery SQL Parameter keine Übergabe
 
Lasse die Datenbank reorganisieren, dann werden die AutoWerte auch wieder angepasst

Jumpy 7. Mär 2011 14:28

AW: ADOQuery SQL Parameter keine Übergabe
 
Zitat:

Zitat von Sir Rufo (Beitrag 1086485)
Zitat:

Zitat von Jumpy (Beitrag 1086452)
Generell mal gefragt, wieso arbeitest du/man mit den Parametern? Mach man das so? Hätte man nicht einfach die Werte direkt beim Zusammenbaues des SQL-Statements da reinschreiben können?

:shock: Um Himmels willen nicht direkt reinbauen

Stichwort: SQL-Injection und Performance (um nur 2 zu nennen)

Danke, wieder was gelernt. Wobei ich zur Entschuldigung sagen muss, dass wir in der Firma mit einer eigenen SQL-Klasse arbeiten, die das maskieren wohl (an unsere DBs angepasst) überwacht und ausserdem nichts mit Benutzereingaben / Webanwendungen machen. Jedoch die Info mit dem Performance-Gewinn ist auch Wert, dass man mal drüber nachdenkt, vor allem, wenn ein Statement mit versch. Parametern mehrfach benutzt werden soll, wie ich eben bei Wikipedia gelernt hab.

Zitat:

Zitat von Sir Rufo
Lasse die Datenbank reorganisieren, dann werden die AutoWerte auch wieder angepasst

Zu Access: Da heißt das, wenn ich mich recht erinnere, Datenbank reparieren und komprinieren. Es kann sein, dass die Tabelle dazu komplett leer sein muss, damit das klappt.

daredd 7. Mär 2011 16:25

AW: ADOQuery SQL Parameter keine Übergabe
 
Ich habe noch eine Frage, wie kann ich eigentlich in einem ADOQuery in einer Tabelle editieren.

DeddyH 7. Mär 2011 16:29

AW: ADOQuery SQL Parameter keine Übergabe
 
Meinst Du die Definition oder die Daten?

daredd 7. Mär 2011 16:42

AW: ADOQuery SQL Parameter keine Übergabe
 
Ich meine die Daten, also ersetze wert x an stelle y mit wert z ))

mkinzler 7. Mär 2011 16:47

AW: ADOQuery SQL Parameter keine Übergabe
 
SQL-Code:
Update <Tabelle> set <y> = <Z>;

DeddyH 7. Mär 2011 16:51

AW: ADOQuery SQL Parameter keine Übergabe
 
Und laut Hilfe sollte man dafür wohl ein TADOCommand statt einer Query benutzen.

Sir Rufo 7. Mär 2011 16:56

AW: ADOQuery SQL Parameter keine Übergabe
 
Zitat:

Zitat von DeddyH (Beitrag 1086573)
Und laut Hilfe sollte man dafür wohl ein TADOCommand statt einer Query benutzen.

Es sei denn er möchte da auch mit Parametern arbeiten :mrgreen:

DeddyH 7. Mär 2011 17:05

AW: ADOQuery SQL Parameter keine Übergabe
 
Ich mache nix mit ADO, aber
Zitat:

TADOCommand führt den in der Eigenschaft CommandText angegebenen Befehl aus. Es kann immer nur ein Befehl aufgerufen werden. Die Parameter des Befehls werden in der Eigenschaft Parameters übergeben. Die eigentliche Ausführung wird von Methode Execute durchgeführt.
Parameters scheint es ja zu geben.

Sir Rufo 7. Mär 2011 17:12

AW: ADOQuery SQL Parameter keine Übergabe
 
Zitat:

Zitat von DeddyH (Beitrag 1086577)
Ich mache nix mit ADO, aber
Zitat:

TADOCommand führt den in der Eigenschaft CommandText angegebenen Befehl aus. Es kann immer nur ein Befehl aufgerufen werden. Die Parameter des Befehls werden in der Eigenschaft Parameters übergeben. Die eigentliche Ausführung wird von Methode Execute durchgeführt.
Parameters scheint es ja zu geben.

jo, stimmt ... habe ich mit
Delphi-Quellcode:
TADOConnection.Execute
verwechselt (Augen auf beim Eierkauf :mrgreen: )

daredd 7. Mär 2011 17:13

AW: ADOQuery SQL Parameter keine Übergabe
 
Das mit dem Update funktioniert ganz gut. Nun noch ein kleines Problem, in der Tabelle einen Tabelle sind Einkaufspreise gegeben. Ich muss nun in die neue Tabelle die berechnten Verkaufspreise übergeben.

Bis jetzt habe ich das hier:
Delphi-Quellcode:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Update Warenbestand set products_price = :price');
ADOQuery1.Parameters.ParamByName('price').Value := FloatToStr(PreisKalkulieren(table1.FieldByName('EK_EUR').AsFloat));
ADOQuery1.ExecSQL;
Das Problem liegt auf der Hand, für jede Zeile in der Tabelle Warenbestand wird immer der selbe Preis-Wert ermittelt. Komm ich mit eine while not table1.Eof... table1.next weiter?

DeddyH 7. Mär 2011 17:27

AW: ADOQuery SQL Parameter keine Übergabe
 
Dann musst Du die alten Datensätze wohl durchgehen. Das bedeutet, dass das ADOCommand noch eine WHERE-Klausel benötigt, um den neuen Datensatz eindeutig zu identifizieren.

[edit] Es sei denn, der neue Preis wird immer gleich berechnet, dann kannst Du das auch per SQL in einem Rutsch machen. [/edit]

daredd 7. Mär 2011 18:02

AW: ADOQuery SQL Parameter keine Übergabe
 
Ich denke nicht, dass es so richtig ist. Hab mir das mal mit Where angeschaut und das query scheint nicht den nächsten Wert aus der Ausgangs-Tabelle zu ziehen.

Mit AdoTable sah das so aus:
Delphi-Quellcode:
while not table1.eof do
begin
table2.fieldbyname('products_price').AsFloat := CalcVerkaufsPreis(table1.fieldbyname('einkauf_price').AsFloat);
table2.post;
table1.next;
table2.next;
end;
Wo springt das Query mit Where auf die nächste Zeile in table1 ?

jobo 7. Mär 2011 18:08

AW: ADOQuery SQL Parameter keine Übergabe
 
Wenn ich das richtig verstanden habe, willst Du die Daten aus der neuen Tabelle updaten und dabei Werte aus der anderen, alten Tabelle nutzen?
Das Stichwort ist "correlated subquery" also korrelierte Unterabfrage.

Hier gibts ein schönes Beispiel, fast schon die passenden Felder, auf Deutsch und in Farbe :)
http://www.sql-und-xml.de/sql-tutori...er-zeilen.html

Unter "Beispiel" Punkt 6 dürfte das stehen, was Du brauchst.

EDIT: Hab Dein letztes Post übersehen, aber ich denke, Du kannst es mit einem einzigen update machen.
EDIT2: Dein Beispiel sieht sehr eigenartig aus. Tabelle 1 und Tabelle 2 werden überhaupt nicht nach irgendeinem Schlüssel "synchronisiert", das wär höchstens Glückssache, wenn das klappt

daredd 7. Mär 2011 18:10

AW: ADOQuery SQL Parameter keine Übergabe
 
jobo, danke für denk link... sieht vielversprechend aus! wenns klappt melde ich mich ))

jobo 7. Mär 2011 18:17

AW: ADOQuery SQL Parameter keine Übergabe
 
wenn's nicht klappt vermutlich erst recht ;)

daredd 7. Mär 2011 18:25

AW: ADOQuery SQL Parameter keine Übergabe
 
haha )) ... so hat geklappt, danke!
hier mal ein beispiel aus meinem code:

Delphi-Quellcode:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE Warenbestand As W INNER JOIN KOMSA As K On W.external_id = K.KOMSANUMMER SET W.products_weight = K.GEWICHT/1000');
ADOQuery1.ExecSQL;
Das mit dem Preis ist noch komplizierter, weil ich dort unterschiedliche prozent-kategorien haben...
gibts eigentlich so was wie ein if then in sql?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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