qt sqlite3 delete Parameter count mismatch

在項目研發中,發如今利用QT操做sqlite3數據庫的時候,在本身封裝的工具類裏面,進行delete操做的時候,數據庫報錯,老是說參數不匹配,可是發現本身傳入的sql語句,以及bindValue都是對的。html

無奈之下,經過在overstackflow查找答案,發現問題。sql

必須按照官網給的例子操做順序來執行。數據庫

先prepare,再bindvalue ,再exec執行。個人實現就是沒有按照這個順序,因此出現這個錯誤。app

問題回答原網站:https://stackoverflow.com/questions/20786003/qt-qsqlquery-bindvalue-works-with-but-not-with-placeholders工具

 

7down votefavoritepost

I'm working with SQLite, doing insert into table. Folowwingfetch

QSqlQuery testQuery(QString("INSERT INTO test(testcol) VALUES(?)"));
testQuery.bindValue(0, someQStringObg);
testQuery.exec();

works, but網站

QSqlQuery testQuery(QString("INSERT INTO test(testcol) VALUES(:val)"));
testQuery.bindValue(":val", someQStringObg);
testQuery.exec();

don't. testQuery.lastError().text() returns No query Unable to fetch rowthis

Have no clue why things are that way, but really want to find out.spa

 
    

Which sql type and version are you using? Which Qt version? Which OS, which version? Have you tried explicit .prepate() call to see the return value? Also, it is strange that you mix the "?" and ":" approaches, though that should not matter. – lpapp Dec 26 '13 at 14:11 

    

Try to print out the last query with this: qDebug () << query->lastQuery() just to make sure. What does that print out? Also, could you please check if the table exists properly before the insertion of the second case? You could use a command line client for double checking this. – lpapp Dec 26 '13 at 14:20 

    

@LaszloPapp with prepare everything works! Thanks! – user3136871 Dec 26 '13 at 14:29

    

OK, great. Submitted an answer for better readability. – lpapp Dec 26 '13 at 14:30

add a comment

 

1 Answer

activeoldestvotes

 

up vote7down voteaccepted

Please use prepare as the official example:

QSqlQuery testQuery;
testQuery.prepare("INSERT INTO test(testcol) VALUES(:val)");
testQuery.bindValue(":val", someQStringObj);
testQuery.exec();

The reason for the error is that the query was executed before binding to the corresponding placeholder. You can see the relevant part of the constructor documentation:

If query is not an empty string, it will be executed.

shareimprove this answer

相關文章
相關標籤/搜索