QT遇坑警告“parameter count mismatch”
阿新 • • 發佈:2018-12-19
1.從資料庫sqlite查詢parameter count mismatch 錯誤衍生的故事 寫了一個數據庫建立時是這樣寫的:
QSqlQuery query; //判斷表是否已經存在 QString sql = QString("select * from sqlite_master where name='%1'").arg("goods"); if(query.exec(sql)) return true; if (!query.exec("CREATE TABLE goods(" "id INT," "name VARCHAR," "number INT)")) { QMessageBox::critical(0, QObject::tr("Database Error"), query.lastError().text()); return false; }
乍一看沒什麼毛病,執行插入語句時是這樣寫的(其中id_in,name_in,number_in分別是int, Qstring, int型別):
query.prepare("insert into goods(id, name, number) values(:id_in,:name_in,:number_in)"); query.bindValue(":id_in",id_in); query.bindValue(":name_in",name_in); query.bindValue(":number_in", number_in); if(!query.exec()) { QMessageBox::critical(0, QObject::tr("Database Error"), query.lastError().text()); return false; }
看似沒什麼毛病,但是插入的時候就會報“parameter count mismatch”錯誤,這是為什麼呢? 然後我將編譯的那個目錄刪掉,多運行了幾次程式,發現這個錯誤導致直接無法插入,但是格式型別是正確的,所以我就思考是不是建表的時候出錯了,然後我又把這些語句拿到PostgreeSQL中去試,發現沒錯啊,然後就盯上檢查goods表是否存在的那條語句了。我把這條語句刪了,把已經編譯好的那個目錄也刪了,然後執行程式,正常了。好吧就是這裡錯了。最後錯誤是query.exec()這句返回的是語句是否正常執行。而要判斷表是否存在需要query.next().通過查閱官方文件,發現exec()只要你的語法是正確的,可以正常執行那就返回true。而真正的查詢結果是是通過next()來檢索的。