You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Qt中INSERT查询的语法错误?

解决Qt中INSERT查询的SQL语法错误问题

我来帮你定位并解决这个问题,你的代码里有几个关键错误点:

错误分析

  • 重复调用exec()方法:你先执行了requete.exec("INSERT ..."),紧接着又在if判断里调用requete.exec(),这会导致第二次执行时没有有效的查询语句,且第一次执行已经改变了查询对象的状态,参数绑定也会失效。
  • SQL常量未加引号:Image字段的值test如果是字符串类型,必须用单引号包裹,否则数据库会把它当作标识符(比如表名/列名),直接触发语法错误。
  • 参数化查询流程错误:Qt的QSqlQuery执行参数化查询的正确流程是:先调用prepare()准备查询语句,再绑定参数,最后仅执行一次exec()。

修正后的代码

void FenPrincipale::boutonAjouter(){
    // 1. 准备参数化查询语句
    requete.prepare("INSERT INTO objets (Nom, Catégorie, Commentaires, Image) VALUES (:Nom, :Catégorie, :Commentaires, 'test')");
    
    // 2. 绑定参数
    requete.bindValue(":Nom", ajout_nom->text());
    requete.bindValue(":Catégorie", liste_categories->currentText());
    requete.bindValue(":Commentaires", ajout_description->toPlainText());
    
    // 调试输出(可保留用于验证参数)
    qDebug() << liste_categories->currentText();
    qDebug() << ajout_description->toPlainText();
    qDebug() << ajout_nom->text();
    
    // 3. 执行查询并判断结果
    if(requete.exec()) {
        qDebug() << "Ok - requete";
        // 注意:INSERT语句不会返回结果集,这个while循环可以直接删除
        // while(requete.next()) {
        // }//fin du while
    } else {
        qDebug() << "Echec de la requête : " << requete.lastError();
    }
}

额外优化建议

如果Image字段的值不是固定的test,而是动态变量,建议也用参数绑定,这样能避免SQL注入风险,也更符合最佳实践:

requete.prepare("INSERT INTO objets (Nom, Catégorie, Commentaires, Image) VALUES (:Nom, :Catégorie, :Commentaires, :Image)");
requete.bindValue(":Image", "你的动态值"); // 替换成实际变量即可

内容的提问来源于stack exchange,提问作者Alios5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:57:37