Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Delphi, ADO, MySQL und ein ganz böser Parameterfehler... (https://www.delphipraxis.net/95356-delphi-ado-mysql-und-ein-ganz-boeser-parameterfehler.html)

Guido R. 5. Jul 2007 13:47

Datenbank: MySQL • Version: 5 • Zugriff über: myODBC

Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
Hallo Allerseits !

Ich habe (mit Delphi 5 SP1) ein Programm geschrieben, dass mittels ADO/ODBC auf eine MySQL-Datenbank zugreift. Im Programm selbst benutze ich dazu u.a. ADOCommands, deren SQL-Anweisungen mittels Parameter Daten zugewiesen werden.

Dies funktioniert auch wunderbar, so lange entweder eine (alte) MDAC 2.80 oder eine (alte) MyODBC 3.51.14 oder noch älter installiert sind.

:coder2:

Wenn sowohl MDAC in der Version 2.81.1117.0 (Teil des XP SP2) als auch MyODBC in der Version 3.51.15 / 3.51.16 vorhanden sind, erhalte ich folgende Fehlermeldung :

"Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden übergeben."

Wenn ich die SQL-Anweisung manuell zusammenbastel und keine Parameter verwende, funktioniert es;
jedoch kann das keine Lösung sein, da ich sehr häufig Parameter in diesem Programm verwende.

Es kann im übrigen auch nicht daran liegen, dass NULL-Werte unbekannten Typs sind, da auch Aufrufe abstürzen, die definitiv keinen NULL-Wert enthalten.

Tritt dieses Problem auch mit Delphi 7 oder neuer auf ?
Irgendwelche Ideen, wie ich das ganze korrigieren kann, ohne alle Parameter herauszunehmen oder alte Treiber vorauszusetzen ??? :gruebel:
(Ich kann einem Kunden ja wohl schlecht erzählen, er solle sich nur alte Treiber installieren...)

Gruß
Guido

mkinzler 5. Jul 2007 13:52

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
Wie sieht die Abfrage aus?

Guido R. 5. Jul 2007 13:59

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
Z.B. so :

SQL-Code:
insert into products_description(
   products_id,
   language_id,
   products_name,
   products_description,
   products_viewed
   ) values (
   :products_id,
   :language_id,
   :products_name,
   :products_description,
   :products_viewed)
ON DUPLICATE KEY UPDATE
   products_name=:name1,
   products_description=:description1
Parameterübergabe mit :
Delphi-Quellcode:
{...}
ADOCmd.Parameters.ParamByName('products_id').Value                  := ID;
{...}

Bernhard Geyer 5. Jul 2007 14:01

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
Zitat:

Zitat von Guido R.
Tritt dieses Problem auch mit Delphi 7 oder neuer auf ?

Wenn der Fehler bei anderen Treiberversionen nicht auftritt ist das kein Delphi-Fehler sondern (höchstwahrscheinlich) ein Problem der (DLL-Hölle-) Kette ADO - ODBC - MyODBC

Zitat:

Zitat von Guido R.
Irgendwelche Ideen, wie ich das ganze korrigieren kann, ohne alle Parameter herauszunehmen oder alte Treiber vorauszusetzen ??? :gruebel:
(Ich kann einem Kunden ja wohl schlecht erzählen, er solle sich nur alte Treiber installieren...)

Und wieso zwingst du deinem Kunden überhaupt irgendwas zu installieren? Für Delphi gibt es z.B. die sehr guten MyDAC-Komponenten. Damit ist mir vollkommen egal ob der Kunde irgendwelche MyODBC, ODBC oder ADO-Updates sich (zwangsweise) installiert. Deine Treiber (und damit potentielle Fehlerquelle) ist:

Anwendung -> ADO-Express/dbGO -> ADO -> OLE DB für ODBC -> ODBC -> MyODBC -> MySQL-Server

mit MyDAC verkürzst du diese potentielle Fehlerquelle auf

Anwendung -> MyDAC -> MySQL-Server


Aber zu deinem Problem: Nutzt du evtl. TADOTable/TADOQuery? Bei Verwendung von TADODataSet sind weniger Fehler zu erwarten (falls der Fehler doch in der ADOExpress/dbGo-Implementierung liegen sollte).

shmia 5. Jul 2007 14:15

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
Man muss darauf achten, dass [TParameter].DataType auf den korrekten Datentyp eingestellt ist.
Bei einer Änderung an der SQL Anweisung versucht die VCL, über den Treiber den korrekten Datentyp zu ermitteln.
Dies kann in vielen Fällen schiefgehen (z.B. bei komplexen Abfragen oder nicht-standard SQL wie in deinem Fall) und dann muss man von Hand eingreifen.
Wenn es ein String-Datentyp ist, muss auch [TParameter].Size korrekt eingestellt werden.

Guido R. 5. Jul 2007 14:22

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
@ B.Geyer

Zitat:

Und wieso zwingst du deinem Kunden überhaupt irgendwas zu installieren? Für Delphi gibt es z.B. die sehr guten MyDAC-Komponenten. Damit ist mir vollkommen egal ob der Kunde irgendwelche MyODBC, ODBC oder ADO-Updates sich (zwangsweise) installiert.
Die Komponenten sind mir bekannt und ich würde sie auch gerne verwenden. Leider sieht das Projekt vor, später auf andere Datenbanken angewendet zu werden. Daher sind alle SQL-Befehle in JvMultiStringHoldern (Jedi sei Dank) gespeichert, so dass für die Varianzen in den SQL-Dialekten lediglich der richtige StringHolder gewählt werden muss.

Zitat:

Aber zu deinem Problem: Nutzt du evtl. TADOTable/TADOQuery? Bei Verwendung von TADODataSet sind weniger Fehler zu erwarten (falls der Fehler doch in der ADOExpress/dbGo-Implementierung liegen sollte).
Nein - Für Update/Insert-Operationen verwende ich die ADOCommand, ansonsten das BetterADODataset.

mkinzler 5. Jul 2007 14:23

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
Ado als Bridge-Pattern-Ersatz kannst du vergessen. ODBC erst recht.
Welceh DBMS sollen zusätzlich unterstützt werden?

Bernhard Geyer 5. Jul 2007 14:29

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
Zitat:

Zitat von mkinzler
Ado als Bridge-Pattern-Ersatz kannst du vergessen. ODBC erst recht.
Welceh DBMS sollen zusätzlich unterstützt werden?

Da nimmt mir einer die Worte aus dem Mund bzw. den Fingern :-)

Guido R. 5. Jul 2007 14:40

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
@shmia

Ich habe mal probiert allen Parametern den Typ zuzuweisen

Delphi-Quellcode:
{...}
ADOCmd.Parameters.ParamByName('products_id').DataType               := ftInteger;
{...}
Das hat nicht ausgereicht - Die zus. Zuweisung der Stringgrößen probiere ich gleich mal aus.

Seltsam ist das das bislang alles wunderbar funktioniert hat und nur die Kombination aus aktuellen ADOs und aktueller MyODBC zu problemen führt...

Guido R. 5. Jul 2007 14:47

Re: Delphi, ADO, MySQL und ein ganz böser Parameterfehler...
 
Zitat:

Ado als Bridge-Pattern-Ersatz kannst du vergessen. ODBC erst recht.
Welche DBMS sollen zusätzlich unterstützt werden?
Der Grundgedanke war bei Kunden evtl. vorhandene DBMS weiter zu nutzen. Konkret ins Auge gefasst war da u.a. MSSQL - Weitere DBs natürlich nicht ausgeschlossen...

Wie bereits gesagt - bislang hatten wir keine Probleme damit - erst die Kombi aus neuen Treibern führte zu der Meldung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz