int sqlite3_prepare( sqlite3 * db,/ *数据库句柄* / const char * zSql,/ * SQL语句,UTF-8编码* / int nByte,/ * zSql的最大长度,以字节为单位。* / sqlite3_stmt ** ppStmt,/ * OUT:语句句柄* / const char ** pzTail / * OUT:指向zSql未使用部分的指针* / ); int sqlite3_prepare_v2( sqlite3 * db,/ *数据库句柄* / const char * zSql,/ * SQL语句,UTF-8编码* / int nByte,/ * zSql的最大长度,以字节为单位。* / sqlite3_stmt ** ppStmt,/ * OUT:语句句柄* / const char ** pzTail / * OUT:指向zSql未使用部分的指针* / ); int sqlite3_prepare_v3( sqlite3 * db,/ *数据库句柄* / const char * zSql,/ * SQL语句,UTF-8编码* / int nByte,/ * zSql的最大长度,以字节为单位。* / unsigned int prepFlags,/ *零个或多个SQLITE_PREPARE_标志* / sqlite3_stmt ** ppStmt,/ * OUT:语句句柄* / const char ** pzTail / * OUT:指向zSql未使用部分的指针* / ); int sqlite3_prepare16( sqlite3 * db,/ *数据库句柄* / const void * zSql,/ * SQL语句,UTF-16编码* / int nByte,/ * zSql的最大长度,以字节为单位。* / sqlite3_stmt ** ppStmt,/ * OUT:语句句柄* / const void ** pzTail / * OUT:指向zSql未使用部分的指针* / ); int sqlite3_prepare16_v2( sqlite3 * db,/ *数据库句柄* / const void * zSql,/ * SQL语句,UTF-16编码* / int nByte,/ * zSql的最大长度,以字节为单位。* / sqlite3_stmt ** ppStmt,/ * OUT:语句句柄* / const void ** pzTail / * OUT:指向zSql未使用部分的指针* / ); int sqlite3_prepare16_v3( sqlite3 * db,/ *数据库句柄* / const void * zSql,/ * SQL语句,UTF-16编码* / int nByte,/ * zSql的最大长度,以字节为单位。* / unsigned int prepFlags,/ *零个或多个SQLITE_PREPARE_标志* / sqlite3_stmt ** ppStmt,/ * OUT:语句句柄* / const void ** pzTail / * OUT:指向zSql未使用部分的指针* / );
要执行SQL语句,必须首先使用以下例程之一将其编译为字节码程序。换句话说,这些例程是准备好的语句对象的构造函数。
首选使用的例程是sqlite3_prepare_v2()。该 sqlite3_prepare()接口是传统的,应当避免。 sqlite3_prepare_v3()有一个额外的“ prepFlags”选项,用于特殊目的。
首选使用UTF-8接口,因为SQLite当前使用UTF-8进行所有解析。提供UTF-16接口是为了方便。UTF-16接口通过将输入文本转换为UTF-8,然后调用相应的UTF-8接口来工作。
第一个参数“ db”是从先前成功调用sqlite3_open(),sqlite3_open_v2()或 sqlite3_open16()获得的数据库连接。数据库连接必须尚未关闭。
第二个参数“ zSql”是要编译的语句,编码为UTF-8或UTF-16。sqlite3_prepare(),sqlite3_prepare_v2()和sqlite3_prepare_v3()接口使用UTF-8,而sqlite3_prepare16(),sqlite3_prepare16_v2()和sqlite3_prepare16_v3()使用UTF-16。
如果nByte参数为负,则将zSql读取到第一个零终止符。如果nByte为正,则为从zSql读取的字节数。如果nByte为零,则不会生成任何准备好的语句。如果调用者知道所提供的字符串以nul终止,则传递nByte参数(即输入字符串中包括 nul终止符的字节数)有一个小的性能优势。
如果pzTail不为NULL,则使* pzTail指向zSql中第一个SQL语句末尾的第一个字节。这些例程仅编译zSql中的第一条语句,因此* pzTail指向未编译的内容。
* ppStmt指向可以使用sqlite3_step()执行的已编译的准备好的语句。如果有错误,则将* ppStmt设置为NULL。如果输入文本不包含SQL(如果输入是空字符串或注释),则* ppStmt设置为NULL。调用过程负责在完成后使用sqlite3_finalize()删除已编译的SQL语句。ppStmt不能为NULL。
成功后,sqlite3_prepare()例程系列将返回SQLITE_OK;否则返回错误代码。
对于所有新程序,建议使用sqlite3_prepare_v2(),sqlite3_prepare_v3(),sqlite3_prepare16_v2()和sqlite3_prepare16_v3()接口。保留了较旧的接口(sqlite3_prepare()和sqlite3_prepare16())是为了向后兼容,但不鼓励使用它们。在“ vX”接口中,返回的准备好的语句(sqlite3_stmt对象)包含原始SQL文本的副本。这导致sqlite3_step()接口以三种方式表现不同:
sqlite3_prepare_v3()与sqlite3_prepare_v2()的不同之处仅在于具有额外的prepFlags参数,该参数是由零个或多个SQLITE_PREPARE_ *标志组成的位数组。sqlite3_prepare_v2()接口的工作原理与带零prepFlags参数的sqlite3_prepare_v3()完全相同。