Qt – Wie binde ich eine QList mit einer „WHERE … IN“-Klausel an eine QSqlQuery?

StackOverflow https://stackoverflow.com/questions/3220357

  •  13-09-2020
  •  | 
  •  

Frage

Notiz:Dies ist bei SQLite der Fall, obwohl ich davon ausgehe, dass das Problem auf der Qt-Seite liegt.

Zuerst habe ich mit dem SQLite-Befehlszeilentool eine Datenbanktabelle eingerichtet:

sqlite> create table testtable ( id INTEGER PRIMARY KEY NOT NULL, state INTEGER );
sqlite> insert into testtable (state) values (0);
sqlite> insert into testtable (state) values (1);
sqlite> insert into testtable (state) values (9);
sqlite> insert into testtable (state) values (20);

Dann teste ich meine Abfrage:

sqlite> SELECT id,state FROM testtable WHERE state IN (0,1,2);
1|0
3|1

(Das sind erwartete Ergebnisse.)

Dann führe ich diesen C++-Code aus:

void runQuery() {
        QSqlQuery qq;
        qq.prepare( "SELECT id,state FROM testtable WHERE state IN (:states)");
        QList<QVariant> statesList = QList<QVariant>();
        statesList.append(0);
        statesList.append(1);
        statesList.append(2);
        qq.bindValue(":states", statesList);
        qq.exec();
        qDebug() << "before";
        while( qq.next() ) {
            qDebug() << qq.value(0).toInt() << qq.value(1).toInt();
        }
        qDebug() << "after";
}

was das ausgibt:

Vor
nach

Es wurden keine Zeilen gedruckt.Ich gehe davon aus, dass das daran liegt, dass ich eine Liste nicht direkt an einen Platzhalter in einer „in“-Klausel binden kann.Aber gibt es eine Möglichkeit, dies zu tun?Ich habe dazu nichts finden können.

War es hilfreich?

Lösung

meine frage egal.Ich denke, was ich versuche, mit vorbereiteten Anweisungen nicht möglich, unabhängig vom Rahmen oder RDBMs.Sie können "Where x in (?)" Tun, aber dann "?"bezieht sich auf einen einzelnen Wert - es kann keine Liste von Werten sein.oder Sie können "woher x in (?,?,?,?) und JEDE '?'?muss separat gebunden sein.

Beispiel:

generasacodicetagpre.

Andere Tipps

Ich habe auch schon seit einiger Zeit nach einer Möglichkeit gesucht, dies zu tun, und Google war nicht sehr hilfreich.Ich begann damit herumzuspielen und es stellte sich heraus, dass es tatsächlich möglich ist, zumindest in begrenztem Umfang.Es wurde nur mit PostgreSQL und SQLite getestet, daher kenne ich keine anderen RDBMS.Mein Fall betrifft nur Ganzzahlschlüssel, sollte aber theoretisch auch für andere Typen funktionieren.
Dies erreichen Sie, indem Sie manuell ein Array erstellen und es an eine Variable binden.Angenommen, ich möchte mehrere Benutzer nach ihren Kriterien auswählen ids aus einer Tabelle, wie z SELECT id, firstname, lastname FROM users WHERE id = ANY(:id).Hier erfahren Sie, wie es gemacht werden kann.

QList<int> ids; // A list of IDs to select
ids << 1 << 5 << 7;

// Create strings from list
QStringList idstrings;
foreach(int id, ids) {
    idstrings << QString::number(id);
}
QString numberlist = idstrings.join(",");

// Create, prepare and execute the query
QSqlQuery sql;
sql.prepare("SELECT id, firstname, lastname FROM users WHERE id = ANY(:id)");
sql.bindValue(":id", numberlist);
sql.exec();

// Now this is possible
while( sql.next() ) {
    qDebug() << sql.value(0).toInt() << sql.value(1).toString() << sql.value(2).toString();
}

Aus dem Gedächtnis getippt, sollte aber in Ordnung sein.Ich weiß, dass diese Antwort extrem spät kommt, aber hoffentlich hilft dieser Beitrag jemand anderem da draußen.Das obige Snippet funktioniert nur mit PostgreSQL.Abhängig von deren Array-Unterstützung ist es jedoch möglich, dies auch auf andere Datenbanken anzupassen.

Ersetzen Sie für SQLite die SQL-Abfrage durch:

sql.prepare("SELECT id, firstname, lastname FROM users WHERE id IN (:id)");

Sie müssen qsqlquery :: execbatch

. generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top