问题是当我执行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之后插入两个相同的行。
任何人都知道问题是什么?
答案 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);
被使用了两次。在代码中删除此行,它应该可以工作。