QtSQL双重插入db

时间:2012-05-27 14:01:41

标签: c++ sql sqlite qt

问题是当我执行sql insert查询(我正在使用Qt Creator和sqlite)时,会在数据库中添加两个新行而不是一行。

这是代码块

void MainWindow::on_insertButton_clicked(){
 db.open();
 QString name = ui->nameLineEdit->text();
 QString queryString = "INSERT INTO highscores (name, score) VALUES '%1',%2";
 QSqlQuery query(queryString.arg(name).arg(score));
 query.exec();
}

此代码应该只将值名称和分数插入数据库一次,但在查询exec之后插入两个相同的行。

任何人都知道问题是什么?

2 个答案:

答案 0 :(得分:5)

不是

QString queryString = "INSERT INTO highscores (name, score) VALUES '%1',%2";

你应该写

QString queryString = "INSERT INTO highscores (name, score) VALUES ('%1',%2)";

SQL的INSERT命令需要在VALUES之后用逗号分隔数据集列表,其中每个在括号中都有列值。< / p>

以下命令将一个元组插入表table

INSERT INTO table (col1, col2) VALUES (val1, val2);
| col1 | col2 |
+------+------+
| val1 | val2 |

因为您没有将这两个值放在括号中,所以您要求SQLite插入两个数据集,每个一个值

INSERT INTO table (col1, col2) VALUES val1, val2;
| col1 | col2 |
+------+------+
| val1 |      |
| val2 |      |

(有趣的是我用我的SQLite和MySQL安装测试了它。当我省略括号时它们都抛出错误。但这可能取决于您使用的版本和一些选项。 )

从不使用QString::arg填写SQL查询的参数!

(或任何其他字符串构建方法,如连接。)这可能会导致SQL injection

为了使用可变参数构建语句,您应该使用QSqlQuery bound values提供的 SQL预编译语句

QString queryString = "INSERT INTO highscores (name, score) VALUES (?,?)";
QSqlQuery query(queryString);
query.addBindValue(name);
query.addBindValue(score);
query.exec();

请注意,我没有在预准备语句中引用字符串参数。

答案 1 :(得分:1)

看起来您的按钮点击事件被调用两次。这通常是因为connectSlotsByName(this);被使用了两次。在代码中删除此行,它应该可以工作。