这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。这个接口需要一个数据库连接指针以及一个要准备的包含sql语句的文本。它实际上并不执行(evaluate)这个sql语句,它仅仅为执行准备这个sql语句
函数定义(仅列出UTF-8的)
intsqlite3_prepare( sqlite3*db,/*Databasehandle*/ constchar*zsql,/*sqlstatement,UTF-8encoded*/ intnByte,/*Maximumlengthofzsqlinbytes.*/ sqlite3_stmt**ppStmt,/*OUT:Statementhandle*/ constchar**pzTail/*OUT:Pointertounusedportionofzsql*/ ); intsqlite3_prepare_v2( sqlite3*db,/*OUT:Statementhandle*/ constchar**pzTail/*OUT:Pointertounusedportionofzsql*/ );
参数:
db:数据指针
nByte:如果nByte小于0,则函数取出zsql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zsql中读取的字节数的最大值。如果nBytes非负,zsql在第一次遇见’/000/或’u000’的时候终止
pzTail:上面提到zsql在遇见终止符或者是达到设定的nByte之后结束,假如zsql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符
ppStmt:能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL,如假如输入的文本不包括sql语句。调用过程必须负责在编译好的sql语句完成使用后使用sqlite3_finalize()删除它。
说明
如果执行成功,则返回sqlITE_OK,否则返回一个错误码。推荐在现在任何的程序中都使用sqlite3_prepare_v2这个函数,sqlite3_prepare只是用于前向兼容
备注
<1>准备语句(prepared statement)对象
typedef struct sqlite3_stmt sqlite3_stmt;
准备语句(prepared statement)对象一个代表一个简单sql语句对象的实例,这个对象通常被称为“准备语句”或者“编译好的sql语句”或者就直接称为“语句”。
语句对象的生命周期经历这样的过程:
l使用sqlite3_prepare_v2或相关的函数创建这个对象
l使用sqlite3_bind_*()给宿主参数(host parameters)绑定值
l通过调用sqlite3_step一次或多次来执行这个sql
l使用sqlite3——reset()重置这个语句,然后回到第2步,这个过程做0次或多次
l使用sqlite3_finalize()销毁这个对象
在sqlite中并没有定义sqlite3_stmt这个结构的具体内容,它只是一个抽象类型,在使用过程中一般以它的指针进行操作,而sqlite3_stmt类型的指针在实际上是一个指向Vdbe的结构体得指针
<2>宿主参数(host parameters)
在传给sqlite3_prepare_v2()的sql的语句文本或者它的变量中,满足如下模板的文字将被替换成一个参数:
l?
l?NNN,NNN代表数字
l:VVV,VVV代表字符
l@VVV
l$VVV
在上面这些模板中,NNN代表一个数字,VVV代表一个字母数字标记符(例如:222表示名称为222的标记符),sql语句中的参数(变量)通过上面的几个模板来指定,如
“select ? from ? “这个语句中指定了两个参数,sqlite语句中的第一个参数的索引值是1,这就知道这个语句中的两个参数的索引分别为1和2,使用”?”的话会被自动给予索引值,而使用”?NNN”则可以自己指定参数的索引值,它表示这个参数的索引值为NNN。”:VVV”表示一个名为”VVV”的参数,它也有一个索引值,被自动指定。
可以使用sqlite3_bind_*()来给这些参数绑定值