Qt多查询操作Sqlite时Update更新语句执行失败问题求助
Qt操作SQLite更新不生效问题排查与解决
核心排查步骤
- 补全SQL执行错误检查:当前代码未判断
QSqlQuery::exec()的返回值,也未捕获执行错误,第一步先添加错误日志定位逻辑,每次执行查询后若返回值为false,打印query.lastError().text()即可得到具体报错原因。 - 修复数据类型溢出问题:代码中把
Id_Composition字段值转换为qint8类型,qint8为8位有符号整数,取值范围仅为-128~127,若表中Id_Composition值超过127会发生类型溢出,导致绑定的参数值错误,自然匹配不到对应数据行。 - 适配命名占位符规则:部分版本的Qt SQLite驱动不支持同一个命名占位符在单条SQL语句中出现多次,原UPDATE语句里
:tmp出现了2次,仅绑定1次可能出现仅替换第一个占位符的问题,导致条件匹配失败。 - 检查事务提交状态:若全局开启了数据库事务未显式执行
commit,修改会在事务提交前不会持久化到数据库。
修复后代码示例
void DataBase::automatisationQteStock(Liste_Commande listeCommande){ if(db.isOpen()){ QSqlQuery query; QSqlQuery query2; QString querySelectIdCompo = "select Id_Composition from Carte_composition cc where Id_Carte = :idcarte ;"; // 拆分UPDATE语句重复占位符,适配驱动兼容性 QString queryUpdate = "update Stock set quantite = quantite - dose from (select quantite as dose, Id_Stock from Composition where Id_Composition = :tmp1) where Stock.Id_Stock = (select Id_Stock from Composition where Id_Composition = :tmp2);"; query.prepare(querySelectIdCompo); query.bindValue(":idcarte", listeCommande.getId_Carte()); if(!query.exec()){ qDebug() << "ID查询失败:" << query.lastError().text(); return; } while(query.next()){ // 替换qint8为int避免类型溢出 int tmp = query.value("Id_Composition").toInt(); qDebug() << "当前处理的Composition ID:" << tmp; query2.prepare(queryUpdate); // 分别绑定两个占位符 query2.bindValue(":tmp1",tmp); query2.bindValue(":tmp2",tmp); if(query2.exec()){ // 打印受影响行数确认更新生效 qDebug() << "更新成功,受影响行数:" << query2.numRowsAffected(); }else{ qDebug() << "更新失败:" << query2.lastError().text(); } } // 若全局开启了事务,取消下方注释执行提交 // db.commit(); } else { qDebug() << "数据库连接未建立"; } }
内容的提问来源于stack exchange,提问作者mdc93
相关产品推荐
相关产品推荐

