我遇到了一个恼人的问题。 qt中的代码无法正常工作,没有语法和运行时错误,只有sqlite3不喜欢我的查询。
此功能会删除用户在个人资料窗口中单击按钮时选择的朋友或朋友。
bool Profilewindow::removeFriends() {
QList<QListWidgetItem *> selectedFriends = ui -> userfriendsList -> selectedItems();
QSqlQuery query;
QStringList stringlist;
if ( MainWindow::getInstance() -> isConnectedToDB() ) {
query.prepare("DELETE FROM user_friends WHERE user_id = :user_id AND f_fname = :f_fname AND f_lname = :f_lname");
for ( int i = 0; i < selectedFriends.count(); ++i ) {
stringlist = selectedFriends.at(i) -> text().split(" ");
qDebug() << this -> user_id;
query.bindValue(":user_id", this->user_id);
qDebug() << stringlist.at(0);
query.bindValue(":f_fname", stringlist.at(0));
qDebug() << stringlist.at(1);
query.bindValue(":f_lname", stringlist.at(1));
if ( !query.exec() ) {
qDebug() << query.lastError().text();
}
}
MainWindow::getInstance() -> closeDBConnection();
if ( this -> updateFriendsList() ) return true;
return false;
}
return false;
}
正确收到绑定的所有参数,它们不是null或空字符串或任何其他wroung数据。
执行查询时qDebug输出: &#34;参数计数不匹配&#34;
无法理解这个奇怪的错误意味着什么?
答案 0 :(得分:0)
有时我会这样简单地进行查询:
QString querytext = QString("DELETE FROM user_friends WHERE user_id = '%1' AND f_fname = '%2' AND f_lname = '%3'")
.arg(this->user_id)
.arg(stringlist.at(0))
.arg(stringlist.at(1));
qDebug() << querytext; // what is really sent do database engine?
query.exec(querytext);
QSqlQuery :: prepare()方法的主要优点是它确实准备了数据库引擎中的执行计划,因此无法一次又一次地准备计划。如果重复执行,运行速度会快得多,请参阅:
In SQLite, do prepared statements really improve performance?