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
相关产品推荐
相关产品推荐

