4

问题是当我执行 sql 插入查询(我使用 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 之后插入两个相同的行。

有人知道有什么问题吗?

4

2 回答 2

6

不是

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

你应该写

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

SQL 的INSERT命令需要一个以逗号分隔的数据集列表VALUES每个数据集都用括号括起来,并带有它们的列值。

以下命令将一个元组插入表中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 注入

为了使用可变参数构建语句,您应该使用QSqlQuery 绑定值提供的SQL 准备语句

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

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

于 2012-05-27T14:13:27.360 回答
1

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

于 2012-05-27T14:05:37.880 回答