Small. Fast. Reliable.
Choose any three.

SQLite C接口

编译SQL语句

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()接口以三种方式表现不同:

  1. 如果数据库模式更改,则sqlite3_step()会自动重新编译SQL语句并尝试再次运行它,而不是像通常那样返回SQLITE_SCHEMA。 在sqlite3_step()放弃并返回错误之前,将进行多达SQLITE_MAX_SCHEMA_RETRY次重试。
  2. 发生错误时,sqlite3_step()将返回详细的 错误代码扩展的错误代码之一。遗留行为是 sqlite3_step()仅返回通用SQLITE_ERROR结果代码,应用程序必须再次调用sqlite3_reset() 才能找到问题的根本原因。使用“ v2” prepare接口,将立即返回错误的根本原因。
  3. 如果WHERE子句中绑定到主机参数的特定值可能会影响语句查询计划的选择,则该语句将在以下任何情况下的第一个sqlite3_step()调用中自动重新编译,就好像发生了模式更改一样。更改为该参数绑定。如果参数是LIKEGLOB运算符的左侧,或者将参数与索引列进行比较并且启用了SQLITE_ENABLE_STAT4编译时选项,则WHERE子句参数的特定值可能会影响查询计划的选择。。

sqlite3_prepare_v3()与sqlite3_prepare_v2()的不同之处仅在于具有额外的prepFlags参数,该参数是由零个或多个SQLITE_PREPARE_ *标志组成的位数组。sqlite3_prepare_v2()接口的工作原理与带零prepFlags参数的sqlite3_prepare_v3()完全相同。

另请参见 对象常量函数的列表