SQlite3数据库连接完成之后,就可以执行SQL命令了。下面将要介绍的prepare和step函数都是用来操作和执行SQL命令的。
典型的函数操作流程(伪代码):
- /* create a statement from an SQL string */
- sqlite3_stmt *stmt = NULL;
- sqlite3_prepare_v2( db, sql_str, sql_str_len, &stmt, NULL );
- /* use the statement as many times as required */
- while( ... )
- {
- /* bind any parameter values */
- sqlite3_bind_xxx( stmt, param_idx, param_value... );
- ...
- /* execute statement and step over each row of the result set */
- while ( sqlite3_step( stmt ) == SQLITE_ROW )
- {
- /* extract column values from the current result row */
- col_val = sqlite3_column_xxx( stmt, col_index );
- ...
- }
- /* reset the statement so it may be used again */
- sqlite3_reset( stmt );
- sqlite3_clear_bindings( stmt ); /* optional */
- }
- /* destroy and release the statement */
- sqlite3_finalize( stmt );
- stmt = NULL;
这段程序首先调用sqlite3_prepare_v2函数,将一个SQL命令字符串转换成一条prepared语句,存储在sqlite3_stmt类型结构体中。随后调用sqlite3_bind_xxx函数给这条prepared语句绑定参数。然后不停的调用sqlite3_step函数执行这条prepared语句,获取结果集中的每一行数据,从每一行数据中调用qlite3_column_xxx函数获取有用的列数据,直到结果集中所有的行都被处理完毕。
prepared语句可以被重置(调用sqlite3_reset函数),然后可以重新绑定参数之后重新执行。sqlite3_prepare_v2函数代价昂贵,所以通常尽可能的重用prepared语句。最后,这条prepared语句确实不在使用时,调用sqlite3_finalize函数释放所有的内部资源和sqlite3_stmt数据结构,有效删除prepared语句。
预处理(Prepare)
- int sqlite3_prepare(
- sqlite3 *db, /* Database handle */
- const char *zSql, /* SQL statement, UTF-8 encoded */
- int nByte, /* Maximum length of zSql in bytes. */