Inside Symbian SQL 翻译连载 三

来源:互联网 发布:c语言调用lua 编辑:程序博客网 时间:2024/05/01 23:08

2.3.6查询一条数据

RSqlStatement对象允许返回数据到客户端。首先,SQL语句传入到RSqlStatement::PrepareL()函数。这个函数把SQL语句编译成SQLite字节码,然后就可以解释出来了(关于字节码(bytecode),第七章会详细讨论)。准备好SQL语句后,调用RSqlStatement::Next()函数来解释预编译的语句。如果函数返回值是KSqlAtRow,你已经成功执行了查询语句并回返回相应的结果。

SELECT语句有个ORDER BY从句(clause)用来对查询出来的数据排序。然而,标题列(title column)的索引可以加速ORDER BY操作,这是因为索引已经包含了一个为标题列在表中排好顺序的属性,就不需要再次排序了。

    RSqlStatement有个ColumnIndex()函数用来识别每个列的序数即列号。如果发生错误,就会返回一个负值,所以好的体验是和User::LeaveIfError()一起使用,或者通过其他办法处理异常。

    然后列号传入RSqlStatementColumnInt()ColumnTextL()函数,然后分别检索当前行并以整型和描述符类型返回它们。

    最后,使用RSqlStatement::Close()函数来关闭RSqlStatement对象。如果它在清除站(cleanup-stack),要使用CleanupStack::PopAndDestroy(&stmt)函数予以清除。这样就释放了对象分配的资源,否则会在应用程序和SQLite服务器发生内存泄露。

2.3.7 更新一条记录

接下来要在表中更新一条记录。更新操作不需要有返回值,所以我们使用RSqlDatabase::Exec()函数。

 

2.3.8 使用列绑定和流来更新一条记录

接下来,我们要用流来把歌曲存入数据库的字段中。要实现这个目标,我们先来介绍两个新概念:

(1)   列绑定

(2)   写入流

使用RSqlParamWriteStream::BindBinaryL()函数来绑定歌曲列,然后歌曲的二进制内容通过流来存入数据库的每条记录中。

在绑定过程中,SQL语句的占位参数替代实际值而编译(如,stmt.PrepareL()),在上面的例子中,Prm1就是一个占位参数。一旦一个列被绑定了,相同的SQL语句就可以带不同的值执行多次而不用再次编译。所有的数据类型都可以通过RsqlStatement的函数来绑定。然而上面的例子中使用RsqlParamWriteStream::BindBinaryL()函数来绑定列是因为这个API提供了额外的写入流功能。

写入流允许用户插入数据到文本或二进制列。这个例子中,RsqlParamWriteStream是用来写入流数据到绑定列。还有一个方法是Write()函数。

SQL语句执行后,需要用Reset()函数将RsqlStatement对象重置到初始状态。这样就可以使预置的SQL语句执行多次。

另外,还有一个更有效的API提供写入流功能,那就是RsqlBlobWriteStream。然而这个类在Symbian^3以后才被支持,详细介绍这个API请看第六章。

 

 

 

 

 

原创粉丝点击