当一条处理语句(prepared statement)被sqlite3_step()执行一次或多次后,能够通过调用sqlite3_reset()来重置,然后就又可以被执行了。调用sqlite3_reset()来重置而不是调用sqlite3_prepare()来重新创建可以避免不必要的消耗。在很多SQL语句中执行sqlite3_prepare()的时间等于或超过sqlite3_step()的时间,因此尽量避免重复调用sqlite3_ prepare ()对性能的改善有重要的意义。
通常我们很少执行多次完全相同的SQL语句,更多的时候我们可能需要执行一个相似的语句,比如需要插入多条数据,那么我们执行的是相似的INSERT语句,只是其中包含的参数不同,这些参数可以在语句被执行之前绑定到一个具体的值上,因此就只需要不断的改变具体的值,然后执行相同的预处理语句(prepared statement)就可以了。
在SQLite中可以在有效的字符串中使用以下几种形式的参数:
?NNN 问号后面跟着数字NNN表示第NNN个参数。NNN的范围在1到SQLITE_MAX_VARIABLE_NUMBLE(默认为999,可以通过sqlite3_limit()来设定)
? 问号代表下一个没有用到的参数
:AAAA 冒号后面跟着特定的名字表示一个被命名为AAAA的参数,命名了的参数也是有序的。
@AAAA 和上面的格式相似
$AAAA 可以包含文本,使用类似TCL语法
这些参数只是代表了一个占位符,这些位置将随后通过调用sqlite3_bind()来填充。没有通过sqlite3_bind()绑定的参数将为NULL。每一次对相同的参数调用sqlite3_bind()都将覆盖掉上一次调用后的赋值。
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
这些绑定函数的第一个参数是一个指向sqlite3_stmt对象的指针,sqlite3_stmt对象是通过sqlite3_prepare_v2()得到的;第二个参数是要设置的参数的索引号,最左边的SQL参数的索引为1,命名了的参数可以通过调用sqlite3_bind_parameter_index()来查看其索引,“?NNN”格式的索引就是NNN;第三个参数为绑定到占位符的值;第四个参数为参数的字节数(注意不是字符数),如果为负,则把参数当作字符串输入;第五个参数是用来销毁BLOB和字符串的函数,如果为SQLITE_STATIC则说明参数为静态分配,不需要释放空间。
如果第一个参数为空,或者是执行过的预处理语句(prepared statement)(已调用过sqlite3_step()),绑定函数将返回SQLITE_MISUSE;如果是一个已经销毁了的预处理语句(prepared statement),函数执行结果将未知。
如果参数索引超出范围将返回SQLITE_RAGE,如果内存分配失败将返回SQLITE_NOMEM。
文章评论(0条评论)
登录后参与讨论