Small. Fast. Reliable.
Choose any three.

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_BUSYSQLITE_DONESQLITE_ROWSQLITE_ERRORSQLITE_MISUSE。使用“ v2”界面,也可能会返回任何其他结果代码扩展结果代码

SQLITE_BUSY意味着数据库引擎无法获取完成其工作所需的数据库锁。如果该语句是COMMIT 或发生在显式事务之外,则可以重试该语句。如果该语句不是COMMIT且发生在显式事务中,则应回滚该事务,然后再继续。

SQLITE_DONE表示该语句已成功完成执行。在未先调用sqlite3_reset()将虚拟机重置回其初始状态之前,不应在此虚拟机上再次调用sqlite3_step()

如果正在执行的SQL语句返回任何数据,则 每次准备好调用者处理新的数据行时,都将返回SQLITE_ROW。可以使用列访问功能访问这些值。再次调用sqlite3_step()以检索下一行数据。

SQLITE_ERROR表示发生了运行时错误(例如违反约束)。sqlite3_step()不应在VM上再次调用。可以通过调用sqlite3_errmsg()找到更多信息。使用旧版接口,可以通过在准备好的语句上 调用sqlite3_reset()来获取更特定的错误代码(例如 SQLITE_INTERRUPTSQLITE_SCHEMASQLITE_CORRUPT等)。在“ v2”界面中,更具体的错误代码由sqlite3_step()直接返回。

SQLITE_MISUSE表示不恰当地调用了此例程。可能是在已经完成的准备语句或先前返回SQLITE_ERRORSQLITE_DONE的语句上调用了它。或者可能是两个或多个线程同时使用同一数据库连接。

对于SQLite的所有版本直至并包括3.6.23.1,将呼叫 sqlite3_reset()是sqlite3_step后需要()返回以外的任何SQLITE_ROW 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编译时选项可用于还原旧行为。

Goofy界面警报:在旧界面中,sqlite3_step()API始终会在除SQLITE_BUSYSQLITE_MISUSE之外的任何其他错误之后返回通用错误代码SQLITE_ERROR。您必须调用 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”接口。

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