在线文档教程
Sqlite
C界面 | C Interface

Evaluate An SQL Statement

评估一个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。或者在同一时刻两个或更多线程正在使用相同的数据库连接。

对于所有版本的SQLite,直到并包括3.6.23.1,sqlite3_step()在sqlite3_step()的任何后续调用之前都返回SQLITE_ROW以外的任何内容之后,需要调用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编译时选项可用于恢复传统行为。

Goofy界面警报:在传统界面中,除了SQLITE_BUSY和SQLITE_MISUSE之外,sqlite3_step()API总是返回一个通用错误代码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”接口。