6

私は試した

  QSqlQuery query;
  query.prepare("DELETE FROM names WHERE id_col = :ID OR id_parent = :ID");
  query.bindValue(":ID", idVal);
  query.exec();

idValが2回バインドされると仮定しますが、このクエリを実行すると、id_parent = idValの行のみが削除され、id_col=idValは削除されません。したがって、2回目だけidValがクエリにバインドされました。

に書き直すと

  QSqlQuery query;
  query.prepare("DELETE FROM names WHERE id_col = ? OR id_parent = ?");
  query.bindValue(0, idVal);
  query.bindValue(1, idVal);
  query.exec();

すべてが期待どおりに機能しました。

QSqlQueryで1つの名前付きプレースホルダーを数回使用する方法ですか?

4

3 に答える 3

3

QSqlQuery::bindValue() ドキュメントから:

クエリ内の複数の場所に値をバインドすることはできません。例:

INSERT INTO testtable (id, name, samename) VALUES (:id, :name, :name)

name へのバインドは最初の :name にバインドしますが、2 番目にはバインドしません。

最後の文は、2 番目の :name にバインドされているように見えるため、少し間違っているように見えますが、いずれにせよ、これは達成しようとしていることが Qt でサポートされていないことを明確に示しています。

あなたの選択肢は、あなたがすでに持っている回避策に固執するか、質問へのコメントで Mahmoud Gamal によって提供された解決策を使用することです。

于 2013-01-11T11:59:56.103 に答える
1

実際に実行されたクエリを確認するには、 を使用できますQSqlQuery::executedQuery()

また、プレースホルダーの値を明示的に設定する必要があります。

QSqlQuery query;
query.prepare("DELETE FROM names WHERE id_col = :ID_COL OR id_parent = :ID_PAR");
query.bindValue(":ID_COL", idVal);
query.bindValue(":ID_PAR", idVal);
query.exec();

また、将来リファクタリングが必要になった場合にも役立ちます。

于 2013-01-11T12:04:57.760 に答える
0

これを最初に試してください:

select * from names where :ID in 
((select id_col FROM names WHERE id_col = :ID)
OR
(select id_parent FROM names WHERE id_parent = :ID)
);

上記の選択で正しいデータが返された場合は、次をクエリとして使用します。

delete from names where :ID in 
((select id_col FROM names WHERE id_col = :ID)
OR
(select id_parent FROM names WHERE id_parent = :ID)
);
于 2013-01-11T11:54:14.670 に答える