SQL查询
需要读取一个简单的记录时SQlObject的功能是够用. 但是当处理情况比较复杂时, 例如多个表的读取, 你可能希望直接使用SQL查询语句. 这个框架能够通过使用占位符生成一个安全的查询.
下面是使用占位符执行ODBC格式的SQL查询的一个例子.
TSqlQuery query;
query.prepare("INSERT INTO blog (id, title, body) VALUES (?, ?, ?)");
query.addBind( 100). addBind( tr(" Hello")). addBind( tr(" Hello world"));
query.exec(); // 执行查询
下面是命名的占位符:
TSqlQuery query;
query.prepare("INSERT INTO blog (id, title, body) VALUES (:id, :title, :body)");
query.bind(":id", 100).bind(":title", tr("Hello")).bind(":body", tr("Hello world"));
query. exec();// 执行查询
如何从查询结果中获取数据与Qt的QSqlQuery类相同.
TSqlQuery query;
query.exec("SELECT id, title FROM blog"); // 执行查询
while (query.next()) {
int id = query.value(0).toInt(); // 转换第二个字段为整形类型
QString str = query.value(1).toString(); // 转换第二个字段为字符串类型
// 处理过程
}
TSqlQuery类也可以同样的方法, 因为它继承于Qt的QSqlQuery类.
概要: 任何情况下都可以使用占位符创建查询.
事实上, 可以在查询记录中查看已经被执行的任何查询.
从文件中读取一个查询
因为源代码中的查询在每次的编写或者修改后都需要执行编译, 你可能会感到在应用开发的过程中显得很麻烦. 为了减轻这种麻烦, 这里有机制可以将查询语句写在独立分离的文件中, 然后在运行时进行加载(译者:可以在开发完成后再写入源文件中).
文件存放在sql目录中(虽然,这个目录可以通过application.ini修改).insert_blog.sql是临时的, 将在下面描述它的内容.
INSERT INTO blog (id, title, body) VALUES (?, ?, ?)
下面是源代码. 使用load()方法读取insert_blog.sql文件.
TSqlQuery query;
query.load("insert_blog.sql")
query. addBind( 100). addBind( tr(" Hello")). addBind( tr(" Hello world"));
query. exec(); // 执行查询
缓存工作在load()方法的内部(但是仅在线程使用 MPM模式时. 只有第一次使用时从文件中读取查询, 然后将使用缓存, 所以它运行得非常快. 文件完成更新后, 为了读取查询语句,我们需要重启服务器.
$ treefrog -k abort ; treefrog -d -e dev
或者像下面这样:
$ treefrog- k restart
从查询结果获得ORM对象
在上面的方法中, 必须从查询的结果获取每个字段的值, 然而, 单条记录可以用下面的方式提取成ORM对象.
使用TSqlQueryMapper对象执行查询. 然后对结果使用迭代器提取ORM对象. 为了选择所有的字段, 在SELECT语句中定义’blog.*‘是非常重要的.
TSqlQueryORMapper<BlogObject> mapper;
mapper.prepare("SELECT blog.* FROM blog WHERE ...");
mapper. exec(); // 执行查询
TSqlQueryORMapperIterator<BlogObject> it(mapper);
while (it.hasNext()) {
BlogObject obj = it.next();
// 处理过程
:
}
如果仅需要提取一个ORM对象, 可以使用execFirst()方法取得结果.