Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADOConnection Paramter nicht gefunden (https://www.delphipraxis.net/168974-adoconnection-paramter-nicht-gefunden.html)

Captnemo 21. Jun 2012 06:10

Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO

ADOConnection Paramter nicht gefunden
 
Hi Leute,

bisher habe ich immer mit MySQL über Zeos gearbeitet, und hatte dabei eigentlich fast nie Probleme.

Jetzt will / muss ich mich mit ADO und MSSQL rumschlagen und zwar unter XE2, und es geht auch gleich los.

Bisher bin ich eigentlich immer so vorgegangen, dass ich für jede Abfrage eine Query hergenommen habe und entsprechen über Query.SQL.Text die Abfrage mit Parametern vorgegeben habe. Zur Laufzeit dann mittel ParamByName('blabla') Werte hinzugefügt. Fertig.

Bei ADO scheint das so einfach nicht mehr zu funktionieren. Wobei ich auch Thread gelesen habe, nach denen müßte es funktionieren.

Mein Code:
Delphi-Quellcode:
      dm1.q_mandanten_insert.Parameters.ParamValues['name']:=frm_neuerMandant.lbledt1.Text;
      dm1.q_mandanten_insert.Parameters.ParamValues['guid']:=GUIDToString(MandantGuid);
      dm1.q_mandanten_insert.ExecSQL;
Der Inhalt von dm1.q_mandanten_insert.sql.text:

Code:
Insert into Mandanten (GUID, Name) VALUES (:guid, :name)
Ergebnis: Fehlermeldung schon in der ersten Zeile "q_mandanten_insert: Parameter 'name' nicht gefunden".

Müssen Parameter bei XE2 bzw. ADO irgendwie zur Designtime irgendwo deklariert werden wenn ich die SQL-Abfrage auch schon vorher in der GUI setze? Bin ich vielleicht von Zeos zu sehr verwöhnt?

Und Bevor die Frage kommt, ja, ich habe auch eine ADOConnection, die ist auch active und meine querys sind auch damit verbunden. :-)

mkinzler 21. Jun 2012 06:33

AW: ADOConnection Paramter nicht gefunden
 
Versuch mal
SQL-Code:
Insert into Mandanten (GUID, Name) VALUES (@guid, @name);

Bummi 21. Jun 2012 06:36

AW: ADOConnection Paramter nicht gefunden
 
Delphi-Quellcode:
   ads.Parameters.ParseSQL(ads.SQL.Text,true);
// gegf. ist bei manchen Konstellationen auch so etwas nötig  
// ads.Parameters.ParamByName('name').DataType := ftString;

Sir Rufo 21. Jun 2012 06:56

AW: ADOConnection Paramter nicht gefunden
 
Man kann schon zur Designtime prüfen, ob die Parameter erkannt wurden -> OI

Damit die Parameter automatisch gesetzt werden sind muss das DataSet eine funktionierende Connection besitzen. Denn nur dann kann der SQL String gegen die Verbindung geprüft werden und die Datentypen für die Parameter ermittelt werden.

Bummi 21. Jun 2012 06:59

AW: ADOConnection Paramter nicht gefunden
 
@Sir Rufo
wobei es bisweilen bei komplexeren Abfragen auch schon zur Designtime ein ftUnknown geben kann, der dann manuell zu setzen ist.

Captnemo 21. Jun 2012 07:03

AW: ADOConnection Paramter nicht gefunden
 
Also mit "@" statt ":" hat nichts gebracht. (Obwohl mir das sogar besser gefallen würde, weil bei hohen Auflösungen ein @ einfach besser zu sehen ist)

Aber ParseSQL war die Lösung. Ich war immer der Meinung, dass müßte man nur machen, wenn man eine parameterisiert Abfrag zur Runtime erstellt. Bei Zeos war's zumindest immer so.

(Hätt ich natürlich auch mal wieder selbst drauf kommen können).

Sollte ich eine ADODataSet dazwischen setzen? Warum? Welchen Vorteil hätte ich dadurch?

Bei der Zeos-Komponente brauchte ich weder eine aktive connection noch ein Dataset damit er meine Parameter ohne ParseSQL erkennt. Das war nur notwendig, wenn ich den SQL-String zur Runtime gesetzt habe. Kann natürlich sein,dass die Datasetfunktionalität schon im Source der Zeos-Komponenten mit drin sind. Das weiß ich natürlich nicht.

Bummi 21. Jun 2012 07:09

AW: ADOConnection Paramter nicht gefunden
 
Vergiss meinen Hinweis auf Adodatasets, war in diesem Zusammenhang nicht korrekt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 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-2025 by Thomas Breitkreuz