SQLite C 接口
执行 SQL 语句
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_step() 之前,需要调用 sqlite3_reset() 。未能使用 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_ERROR ,在除SQLITE_BUSY和SQLITE_MISUSE之外的任何错误之后。您必须调用 sqlite3_reset()或sqlite3_finalize()才能找到能够更好地描述错误的特定错误代码之一。我们承认这是一个愚蠢的设计。该问题已通过“v2”界面修复。如果您使用sqlite3_prepare_v3()或sqlite3_prepare_v2() 或sqlite3_prepare16_v2()或sqlite3_prepare16_v3()准备所有 SQL 语句而不是遗留的sqlite3_prepare()和sqlite3_prepare16()接口,然后更具体的错误代码由 sqlite3_step() 直接返回。建议使用“vX”接口。