int sqlite3_step(sqlite3_stmt*);
在使用任何 准备好的语句 进行准备后,可以使用 sqlite3_prepare_v2()、sqlite3_prepare_v3()、sqlite3_prepare16_v2() 或 sqlite3_prepare16_v3() 或其中一个遗留接口 sqlite3_prepare() 或 sqlite3_prepare16(),必须调用此函数一次或多次来评估语句。
sqlite3_step() 接口的行为细节取决于语句是使用较新的“vX”接口 sqlite3_prepare_v3()、sqlite3_prepare_v2()、sqlite3_prepare16_v3()、sqlite3_prepare16_v2() 还是较旧的遗留接口 sqlite3_prepare() 和 sqlite3_prepare16() 进行准备的。建议在新应用程序中使用新的“vX”接口,但遗留接口将继续得到支持。
在遗留接口中,返回值将是 SQLITE_BUSY、SQLITE_DONE、SQLITE_ROW、SQLITE_ERROR 或 SQLITE_MISUSE。使用“v2”接口时,也可能会返回任何其他 结果代码 或 扩展结果代码。
SQLITE_BUSY 表示数据库引擎无法获取完成其工作所需的数据库锁。如果语句是 COMMIT 或发生在显式事务之外,则可以重试语句。如果语句不是 COMMIT 并且发生在显式事务中,则应在继续之前回滚事务。
SQLITE_DONE 表示语句已成功执行完毕。在调用 sqlite3_reset() 将虚拟机重置回其初始状态之前,不应再次在此虚拟机上调用 sqlite3_step()。
如果正在执行的 SQL 语句返回任何数据,则每次有新数据行准备好供调用者处理时,都会返回 SQLITE_ROW。可以使用 列访问函数 访问这些值。再次调用 sqlite3_step() 以检索下一行数据。
SQLITE_ERROR 表示已发生运行时错误(例如违反约束)。不应再次在 VM 上调用 sqlite3_step()。可以通过调用 sqlite3_errmsg() 找到更多信息。使用遗留接口时,可以通过对 准备好的语句 调用 sqlite3_reset() 获得更具体的错误代码(例如,SQLITE_INTERRUPT、SQLITE_SCHEMA、SQLITE_CORRUPT 等等)。在“v2”接口中,更具体的错误代码由 sqlite3_step() 直接返回。
SQLITE_MISUSE 表示此例程被不恰当地调用。可能是它在一个已被 最终化 的 准备好的语句 或一个以前已返回 SQLITE_ERROR 或 SQLITE_DONE 的语句上被调用。或者可能是同一数据库连接在同一时刻被两个或多个线程使用的情况。
对于包括 3.6.23.1 在内的所有 SQLite 版本,在 sqlite3_step() 返回除 SQLITE_ROW 之外的任何值后,需要调用 sqlite3_reset(),才能进行任何后续的 sqlite3_step() 调用。如果未能使用 sqlite3_reset() 重置准备好的语句,将导致 sqlite3_step() 返回 SQLITE_MISUSE。但在 3.6.23.1 版本(2010-03-26)之后,sqlite3_step() 开始在此情况下自动调用 sqlite3_reset(),而不是返回 SQLITE_MISUSE。这并不被认为是不兼容的更改,因为任何曾经收到 SQLITE_MISUSE 错误的应用程序都明确地已损坏。编译时选项 SQLITE_OMIT_AUTORESET 可用于恢复遗留行为。
愚蠢的接口警示:在遗留接口中,sqlite3_step() API 在除 SQLITE_BUSY 和 SQLITE_MISUSE 之外的任何错误之后,始终返回一个通用错误代码,即 SQLITE_ERROR。您必须调用 sqlite3_reset() 或 sqlite3_finalize() 才能找到一个更能描述错误的特定 错误代码。我们承认这是一种愚蠢的设计。这个问题在“v2”接口中已得到解决。如果您使用 sqlite3_prepare_v3() 或 sqlite3_prepare_v2() 或 sqlite3_prepare16_v2() 或 sqlite3_prepare16_v3() 而不是遗留的 sqlite3_prepare() 和 sqlite3_prepare16() 接口来准备所有 SQL 语句,则更具体的 错误代码 将由 sqlite3_step() 直接返回。建议使用“vX”接口。