ak.
ak.

Reputation: 3449

QSqlQuery prepared statements - proper usage

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?

Upvotes: 4

Views: 5471

Answers (1)

ak.
ak.

Reputation: 3449

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

Upvotes: 7

Related Questions