4

I'm trying to determine the proper way to use prepared statements with QSqlQuery. The docs are not very specific on this subject.

void select(const QSqlDatabase &database) {
    QSqlQuery query(database);
    query.prepare("SELECT * FROM theUniverse WHERE planet = :planet");
    query.bindValue(":planet", "earth");
    query.exec();
}

So will this snippet create a permanent prepared statement in the connection database? Will this prepared statement persist between calls to select(), i.e. will it be saved when the function returns and QSqlQuery query is disposed?

Or should I create QSqlQuery on the heap and use the same instance over and over again?

1 Answer 1

7

Ok, the idea is that you have to create QSqlQuery on heap, prepare the query and do the following with it:

  1. QSqlQuery::bindValue(s)
  2. QSqlQuery::exec
  3. read data with QSqlQuery::[next|first|last|...]
  4. QSqlQuery::finish
  5. rinse and repeat

the following snipped is useful to create, prepare and retrieve queries on heap:

QSqlDatabase database;
QMap<QString, QSqlQuery *> queries; //dont forget to delete them later!

QSqlQuery *prepareQuery(const QString &query)
{
    QSqlQuery *ret = 0;
        if (!queries.contains(query)) {
            QSqlQuery *q = new QSqlQuery(database);
            q->prepare(query);
            queries[query] = ret = q;
        } else {
            ret = queries[query];
        }
    }
    return ret;
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.