Qt 5 avec SQLite: bindValue() résultats dans “Paramètre nombre d'erreur” incompatibilité de
Je suis en train de faire une simple requête paramétrée avec Qt 5.3.1 (64 bits) sur Windows 7 en utilisant le driver SQLite. Lorsque j'utilise bindValue()
pour définir la valeur du paramètre unique de ma requête, j'ai systématiquement le redoutable "nombre de Paramètre d'erreur" incompatibilité. Tout fonctionne bien lorsque j'utilise addBindValue()
. Notez que le code avec bindValue()
fonctionne très bien avec Qt 4.8.5 (64-bit).
Voici le code complet (main.cpp
):
#include <QtSql>
int main(int, char* [])
{
auto db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("db.sqlite");
db.open();
{
QSqlQuery query("CREATE TABLE IF NOT EXISTS hashes (filepath TEXT, modified INTEGER, hash TEXT)", db);
query.exec();
}
QSqlQuery query("SELECT modified FROM hashes WHERE filepath = :fp", db);
query.bindValue(":fp", "test.jpg");
if (!query.exec())
qDebug() << query.lastError();
db.close();
return 0;
}
QtCreator fichier de projet (qtsqltest.pro
):
QT += core sql
TARGET = qtsqltest
TEMPLATE = app
SOURCES += main.cpp
De sortie du programme sur ma machine:
QSqlError("", "Parameter count mismatch", "")
Une idée?
double possible de Qt QSqlQuery bindValue fonctionne avec ? mais pas avec :des espaces réservés
OriginalL'auteur François Beaune | 2014-07-10
Vous devez vous connecter pour publier un commentaire.
Je viens de découvrir que ma question est un doublon de cette une et que le réponse correspondante est correct.
Il s'avère que les chaînes de requête transmise au constructeur de
QSqlQuery
sont exécutés immédiatement, comme par le la documentation.Il n'est pas clair pourquoi ces requêtes fonctionnent très bien avec Qt 4.8.5, ou pourquoi ils font un travail avec Qt 5.3.1 lors de l'utilisation de paramètres positionnels (à l'aide de
?
espaces réservés) alors qu'ils échouent avec des paramètres nommés (à l'aide de:
espaces réservés).query.prepare( "INSERT INTO tablename (columnname) VALUES :placeholder" );
j'ai eu à fairequery.prepare( "INSERT INTO tablename (columnname) VALUES (:placeholder)" );
J'ai eu un problème similaire (avec une utilisation correcte de la préparer), mais la mienne erreur était une erreur de frappe dans la requête sql (j'ai eu "SELECT a, b, bdepuis table" au lieu de "SELECT a, b, c from table")...message d'Erreur "Paramètre nombre incompatibilité" était vraiment trompeur ici...Peut aider quelqu'un, bonne chance!
J'ai aussi eu le même problème . Mais j'étais mal à datadase chemin > db.setDatabaseName(chemin);
OriginalL'auteur François Beaune