2013-01-11 18 views
6

我試圖類SqlQuery一個指定的佔位符幾次

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

假設idVal將被綁定兩次,但id_parent = idVal執行這個查詢只能行被刪除,與id_col = idVal保持未刪除。所以只有第二次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

**附註:**這不回答你的問題,但你可以'加入'刪除並只使用一個佔位符。例如:'DELETE n FROM names n INNER JOIN names p ON p.id_col = n.id_parent WHERE id_col =:ID'。 –

+2

對於後代,當你在做選擇陳述時,我發現了一個相關問題的黑客。使用['with with clause'](https://www.sqlite.org/lang_with.html)如下所示:'with my_id as(values(:id))select * from names where id =(select * from my_id)或parent_id =(select * from my_id)' –

+0

*吝嗇地*:在qt 5中刪除了這個約束,所以在qt 5之前只需要解決方法。 –

回答

3

QSqlQuery::bindValue() documentation

值不能綁定到查詢中的多個位置,例如:

INSERT INTO TestTable的(ID,姓名,samename)VALUES(:ID,:姓名,:名稱)

綁定到名稱將結合到第一:名稱,而不是第二。

最後一句似乎有點不對,因爲它看起來像綁定到第二個:名稱,但無論哪種方式,這清楚地表明你試圖實現的東西不被Qt支持。

您的選擇是堅持您已有的解決方法,或使用Mahmoud Gamal提供的解決方案在您的問題的評論中。

+1

在Qt 5.9.1的文檔中(http://doc.qt .io/qt-5/qsqlquery.html#bindValue)此文本被刪除,並且多重綁定確實有效。 – scopchanov

0

試試這個第一個DO:

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) 
); 
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(); 

而且這將是有用的,如果你需要在今後的重構。

相關問題