2012-12-18 3 views
1

Voici mon code, il ne semble pas être quelque chose de mal:En utilisant la base de données SQLite avec qt

QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName("thedata.sqlite"); 
db.open(); 

QSqlQuery query; 
query.prepare("SELECT lastname FROM people where firstname='?' "); 
query.bindValue(0, lineEdit->text()); 

bool x = query.exec(); 

if(x){ 
    lineEdit_2->setText(query.value(0).toString()); 
} 

else { 
    QSqlError err; 
    err = query.lastError(); 
    QMessageBox::about(this,"error",err.text() ); 
} 

Lorsque le programme fonctionne toujours donne l'erreur parameter count mismatch j'utilise qt 4.8 et son propre en-têtes pour l'utilisation de sqlite.

Je serais très reconnaissant pour tout conseil, même si j'ai cherché dans google je vois beaucoup de messages dans ce numéro mais rien ne m'a aidé.

Merci.

+0

Avez-vous vérifié que 'lineEdit-> text()' renvoie réellement quelque chose, de préférence une chaîne? –

+0

@TimoGeusch oui c'est sûr, je tape le prénom. –

Répondre

2

Vous êtes déclaration préparée est mauvaise, il devrait être:

quary.prepare("SELECT lastname FROM people where firstname=?"); 

avis qu'il n'y a pas des guillemets simples (') autour de l'espace réservé. Si vous placez les guillemets, ils sont transmis en tant que littéraux à la base de données, ce qui vous laisse avec une requête sans paramètre et un code qui passe trop de paramètres.

(VIDANGE ce nom variable query serait une belle touche aussi.)

vous devez également vérifier la valeur de retour si QSqlQuery::prepare et imprimer/afficher le message d'erreur que vous obtenez de cette si échoue – sinon QSqlQuery::exec réinitialise l'erreur en cours et vous obtiendrez un message d'erreur assez vide s'il y avait un problème d'analyse de l'instruction préparée.

if(x){ 
    lineEdit_2->setText(quary.value(0).toString()); 
} 

Ceci est également incorrect. Vous devez appeler (et vérifier la valeur de retour de) query.next() pour positionner le jeu de résultats sur la première ligne renvoyée (s'il y en a une). Vous ne pouvez pas utiliser .value(X) avant d'avoir appelé .next().

+0

maintenant, il ne donne pas d'erreur eny mais rien ne se passe. il n'affiche pas le nom de famille dans lineEdit_2 –

+0

C'est un problème différent. Vous devez avancer le jeu de résultats vers la première ligne avec 'query.next()', sinon 'query' n'est pas positionné sur une ligne. – Mat

+0

ok accepté comme réponse. Merci beaucoup, je n'aurais jamais trouvé ça seul, j'essayais de résoudre ça pendant des heures. Merci encore... :) –

Questions connexes