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

SQLITE_MISUSE意味着这个例程被不恰当地调用了。也许它是在一个已经完成的准备好的语句上调用的,或者是在一个之前返回过 SQLITE_ERRORSQLITE_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_BUSYSQLITE_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”接口。

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