Seite 1 von 1
[solved]QMYSQL: Warum funktionieren prepared queries nicht
Verfasst: 3. Dezember 2007 13:36
von gerome69
Hallo,
ich arbeite unter Windows XP (Qt 4.3.X) einer QSqlDatabase, die mit einer MySQL-Datenbank verbunden ist.
Geht auch alles wunderbar ausser den prepared Statements:
Code: Alles auswählen
QSqlQuery
sqlQuery.prepare("SELECT orderNumber FROM JobsCreditSuisse WHERE ID= ? ");
sqlQuery.addBindValue(1);
sqlQuery.exec();
Dieses funktioniert aber nicht,
"Using unsupported buffer type: 0 (p
arameter: 1) QMYSQL3: Unable to bind outvalues"
Über lastQuery() und executedQuery() bekomme ich genau das SQL-Statement incl. des "?" zurück. Kein Platzhalter wurde ersetzt.
Ich habe auch schon versucht:
sqlQuery.addBindValue("1");
sqlQuery.addBindValue(QVariant(1));
Ergebnis immer der gleiche Fehler. Was könnte falsch laufen.?
ein driver->hasFeature() liefert im konkreten Fall:
QSqlDriver::PreparedQueries TRUE
QSqlDriver::NamedPlaceholders FALSE
QSqlDriver::PositionalPlaceholders TRUE
Mit MSSQL funktioniert es so einwandfrei.
Danke für Tips, Gérôme
Verfasst: 3. Dezember 2007 14:48
von ClassicSubzero
Dein SELECT-String enthält keine Platzhalter. Wie ich sehe, möchtest du ja an der Stelle von ? einen Platzhalter einfügen, dann musst du das Zeichen entsprechend in Klammern setzten.
Zum Beispiel funktioniert dieses SQL-Statement:
Code: Alles auswählen
query.exec( QString( "INSERT INTO Tabelle (Spalte1, Spalte2 , Spalte3) VALUES ( '%1', '%2', '%3' )" ).arg(Sprache).arg(Nummer).arg(Texte) );
oder
Code: Alles auswählen
query.prepare("INSERT INTO Tabelle ( Spalte1, Spalte2 , Spalte3) "
"VALUES ( ?, ?, ?)");
query.bindValue(0, Sprache);
query.bindValue(1, Nummer);
....
usw
Verfasst: 3. Dezember 2007 14:59
von gerome69
ClassicSubzero hat geschrieben:
Zum Beispiel funktioniert dieses SQL-Statement:
Code: Alles auswählen
query.exec( QString( "INSERT INTO Tabelle (Spalte1, Spalte2 , Spalte3) VALUES ( '%1', '%2', '%3' )" ).arg(Sprache).arg(Nummer).arg(Texte) );
Klar kann ich das so machen, aber dann muß ich mich um das Escapen selbst kümmern.
Darum wollte ich die elegantere Methode mit bindValue nutzen.
ClassicSubzero hat geschrieben:
Code: Alles auswählen
query.prepare("INSERT INTO Tabelle ( Spalte1, Spalte2 , Spalte3) "
"VALUES ( ?, ?, ?)");
query.bindValue(0, Sprache);
query.bindValue(1, Nummer);
Wo ist der Unterschied zu meinem Statement-Part "WHERE ID= ? "? Ich verwende einen Platzhalter und es wird ja auch versucht, ihn zu ersetzen, was mit der Fehlermeldung "Using unsupported buffer type: 0 (parameter: 1) QMYSQL3: Unable to bind outvalues" endet.
G.
Die Google-Suche...
Verfasst: 3. Dezember 2007 15:29
von gerome69
... führte zu folgendem MySQL-Bugreport:
http://bugs.mysql.com/bug.php?id=21369
Aber eine wirkliche Lösung finde ich da nicht, was ich im konkreten Fall mit Qt tun kann, wenn es scheinbar ein MySQL-Problem ist.
Der Server den ich benutze/benutzen muß hat folgende Version (auf die nicht wirklich Einfluß nehmen kann):
Ver 5.0.27-log for redhat-linux-gnu on i686 (Source distribution)
G.
Verfasst: 3. Dezember 2007 17:28
von upsala
Welche Datenbankversion verwendest du?
Verfasst: 3. Dezember 2007 18:22
von gerome69
upsala hat geschrieben:Welche Datenbankversion verwendest du?
Steht schon im Beitrag drüber:
mysqld -v liefert:
Ver 5.0.27-log for redhat-linux-gnu on i686 (Source distribution)
Verfasst: 3. Dezember 2007 19:04
von upsala
Sorry, hatte ich übersehen.
Habs jetzt mit Qt4.4, Qt4.3 und MySQL4.1.11 und 5.0.32 getestet und kann diesen Fehler nicht nachvollziehen.
Aber vielleicht hilft dir das weiter:
Link
Verfasst: 3. Dezember 2007 19:18
von gerome69
Habe mal geschaut: mein Qt 4.3.1 ist gegen libmysql 4.1.13a (aus dem devcpp-Paket) gelinkt. Ob er mit dieser Clientlibrary nicht alle Funktionen des Servers nutzen kann?
G.
Verfasst: 3. Dezember 2007 19:21
von dhcase
Vielleicht hast du noch eine alte MySQL-DLL irgendwo im PATH rumliegen, das war jedenfalls bei mir mal der Fall bei einer "Using unsupported buffer type"-Fehlermeldung...
Verfasst: 3. Dezember 2007 19:36
von gerome69
dhcase hat geschrieben:Vielleicht hast du noch eine alte MySQL-DLL irgendwo im PATH rumliegen, das war jedenfalls bei mir mal der Fall bei einer "Using unsupported buffer type"-Fehlermeldung...
In der Tat. Das war's. Habe die passende mysql.dll gefunden, ins aktuelle Verzeichnis kopiert... und o wunder... addBindValue(...) funktioniert!
Danke für den Tip, Gérôme