【问题标题】:QtSQL double inserting into dbQtSQL双重插入数据库
【发布时间】:2012-05-27 14:01:40
【问题描述】:

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

谁知道问题出在哪里?

【问题讨论】:

  • 显然,问题在于您调用了两次代码(第二种可能性是您有一个插入两行的插入触发器可能非常非常遥远)。我建议您将调试语句放入 C++ 代码中或使用调试器来跟踪正在发生的事情。
  • 你是说如果你点击按钮两次,就会插入两行,你不想这样吗?
  • 我只想在点击 QPushButton 时在 db 中插入数据。我不是点击两次,只是点击一下,插入了两行。

标签: c++ sql sqlite qt


【解决方案1】:

不是

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 injection

要使用可变参数构建语句,您应该使用QSqlQuery bound values 提供的SQL 准备语句

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

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

【讨论】:

  • 我在 query.exec() 之后添加了 qDebug("foo") 并且在 db 中添加了两个新行而不是一个
  • @B.P.调试输出中只出现一行“foo”?
  • 尝试将?,? 放在括号中,如更新的答案所示。 VALUES 之后的 AFAIK 是要插入的数据集列表,因此您提供了两个数据集。由多个值组成的数据集在括号中标注为元组。但是我认为完全省略括号应该会导致错误。如果这是真的,我会在未来读者的答案中强调这一点。
  • 我用你写的块替换了我的查询块,之后我的程序开始正常工作。谢谢。
【解决方案2】:

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

【讨论】:

  • 只有一行写着:QMetaObject::connectSlotsByName(MainWindow),当我删除它时,按钮不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2018-12-20
相关资源
最近更新 更多