2011-04-10 128 views
3

我想确定使用QSqlQuery的准备语句的正确方法。文档在这个主题上并不是很具体。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并反复使用同一个实例吗?

回答

5

好,这个想法是,你必须在堆上创建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; 
}