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

Qt C++如何将CSV文件中的字符串值插入SQLite数据库

问题根因

插入失败是SQL语法规则导致的:

  • SQLite对SQL语句中的字符串字面量要求必须用单引号'包裹,你当前拼接生成的语句INSERT INTO main VALUES(a,b,c);中,a/b/c没有被单引号包裹,SQLite会将其识别为字段名而非待插入的字符串值,找不到对应字段就会报错插入失败;而整数值不需要加引号,因此可以正常插入。
  • 现有直接拼接SQL字符串的写法还存在两个隐患:
    • 若CSV字段值本身包含单引号、逗号,会直接导致SQL语法错误
    • 存在SQL注入风险
  • 原有代码中调用了que.lastError()但没有打印输出,无法直接查看具体报错信息,不利于排查。
修复方案

方案1:快速修改原有拼接逻辑

给每个拼接的字段值包裹单引号,同时转义值内部的单引号:

QFile f(csvFile);
if(f.open (QIODevice::ReadOnly)){
    QSqlQuery que;
    QTextStream ts (&f);

    while(!ts.atEnd()){
        QString req = "INSERT INTO main VALUES(";
        QStringList line = ts.readLine().split(',');
        for(int i=0; i<line.length();++i){
            // 包裹单引号,同时转义值内的单引号
            QString val = "'" + line.at(i).replace("'", "''") + "'";
            req.append(val);
            req.append(",");
        }
        req.chop(1);
        req.append(");");
        bool execRes = que.exec(req);
        if(!execRes){
            // 打印执行错误方便排查
            qDebug() << "插入失败:" << que.lastError().text() << "执行语句:" << req;
        }
    }
    f.close();
}

方案2:使用Qt推荐的参数绑定写法(更安全)

无需手动处理转义,也能避免SQL注入风险:

QFile f(csvFile);
if(f.open (QIODevice::ReadOnly)){
    QSqlQuery que;
    QTextStream ts (&f);

    while(!ts.atEnd()){
        QStringList line = ts.readLine().split(',');
        // 生成带占位符的SQL语句
        QString req = "INSERT INTO main VALUES(" + QString("?,").repeated(line.size()).chopped(1) + ");";
        que.prepare(req);
        // 绑定所有值
        for(int i=0; i<line.size(); i++){
            que.bindValue(i, line.at(i));
        }
        bool execRes = que.exec();
        if(!execRes){
            qDebug() << "插入失败:" << que.lastError().text() << "执行语句:" << req;
        }
    }
    f.close();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:06:05