不是
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();
请注意,我没有在准备好的语句中引用字符串参数。