2013-01-11 9 views
6

Próbowałemsqlquery jeden nazwanych znaczników kilkakrotnie

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

zakładając, że idVal będą zbindowanych dwa razy, ale wykonanie tego zapytania tylko wiersze z id_parent = idVal zostanie usunięty z id_col = idVal pozostaje przywrĂłconych. Tak więc dopiero drugi raz wiązano idVal z zapytaniem.

Kiedy przepisać go do

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

wszystko działało zgodnie z oczekiwaniami.

Czy w QSqlQuery można wielokrotnie używać jednego nazwanego obiektu zastępczego?

+1

** Uwaga boczna: ** To nie odpowiada na twoje pytanie, ale możesz "JOIN" z usunięciem i użyć tylko jednego symbolu zastępczego. Coś takiego jak: 'USUŃ n od nazw n WEJŚCIE DOŁĄCZ DO TYPU p ON p.id_col = n.id_parent WHERE id_col =: ID'. –

+2

Dla potomności, znalazłem hack dla pokrewnego problemu, gdy robisz _select_ instrukcje. Użyj ['z klauzulą'] (https://www.sqlite.org/lang_with.html) w następujący sposób:' z my_id jako (values ​​(: id)) wybierz * z nazw gdzie id = (wybierz * z my_id) lub parent_id = (wybierz * z my_id) ' –

+0

* nieśmiało *: To ograniczenie jest usuwane w qt 5, więc obejścia są potrzebne tylko przed qt 5. –

Odpowiedz

3

Z QSqlQuery::bindValue() documentation:

Wartości nie mogą być powiązane z wieloma lokalizacjami w zapytaniu, np .:

WKŁADKA DO testtable (identyfikator, nazwisko, samename) WARTOŚCI (: identyfikator, nazwa,: name)

Wiązanie nazwy będą wiązały się z pierwszą nazwę, lecz nie do drugiego.

Ostatnie zdanie wydaje się być nieco błędne, ponieważ wygląda na to, że wiąże się z drugim: nazwa, ale tak czy inaczej, to wyraźnie stwierdza, co próbujesz osiągnąć nie jest obsługiwane przez Qt.

Twoje opcje to trzymać się obejścia, które już masz, lub użyj rozwiązania dostarczonego przez Mahmouda Gamala w komentarzu do twojego pytania.

+1

W dokumentacji Qt 5.9.1 (http: //doc.qt .io/qt-5/qsqlquery.html # bindValue) ten tekst jest usuwany, a wiązanie wielokrotne rzeczywiście działa. – scopchanov

0

Spróbuj najpierw zrobić:

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

jeśli powyżej wybierz powrócił odpowiednie dane, a następnie użyć jednego z poniższych zapytanie:

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

Aby zobaczyć, które zapytanie zostało faktycznie wykonane, można użyć QSqlQuery::executedQuery().

I należy jawnie ustawić wartości zastępcze:

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

także będzie przydatna, jeśli trzeba będzie refaktoryzacji w przyszłości.

Powiązane problemy