QSqlQuery подготовленные операторы - правильное использование - PullRequest
3 голосов
/ 10 апреля 2011

Я пытаюсь определить правильный способ использования подготовленных операторов с QSqlQuery. Документы на эту тему не очень специфичны.

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

Так будет ли этот фрагмент создавать постоянный подготовленный оператор в соединении database? Будет ли сохраняться этот подготовленный оператор между вызовами select(), т.е. будет ли он сохранен после возврата из функции и удаления QSqlQuery query?

Или я должен создать QSqlQuery в куче и использовать один и тот же экземпляр снова и снова?

1 Ответ

5 голосов
/ 14 апреля 2011

Хорошо, идея в том, что вам нужно создать QSqlQuery в куче, подготовить запрос и сделать с ним следующее:

  1. QSqlQuery::bindValue(s)
  2. QSqlQuery::exec
  3. читать данные с QSqlQuery::[next|first|last|...]
  4. QSqlQuery::finish
  5. промыть и повторить

следующий фрагмент полезен для создания, подготовки и получения запросов в куче:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...