int sqlite3_errcode(sqlite3 *db); int sqlite3_extended_errcode(sqlite3 *db); const char *sqlite3_errmsg(sqlite3*); const void *sqlite3_errmsg16(sqlite3*); const char *sqlite3_errstr(int); int sqlite3_error_offset(sqlite3 *db);
如果与 数据库连接 D 相关的最近一次 sqlite3_* API 调用失败,则 sqlite3_errcode(D) 接口将返回该 API 调用的数字 结果代码 或 扩展结果代码。sqlite3_extended_errcode() 接口相同,只是它始终返回 扩展结果代码,即使扩展结果代码被禁用也是如此。
sqlite3_errcode() 和/或 sqlite3_extended_errcode() 返回的值可能会随着每次 API 调用而改变。但是,有一些接口保证永远不会改变错误代码的值。保留错误代码的接口包括以下内容:
sqlite3_errmsg() 和 sqlite3_errmsg16() 返回描述错误的英文文本,分别以 UTF-8 或 UTF-16 格式,或者如果无错误消息可用则返回 NULL。(参见 SQLite 如何处理 无效 UTF 以了解此规则的例外情况。)用于保存错误消息字符串的内存由内部管理。应用程序无需担心释放结果。但是,错误字符串可能会被后续对其他 SQLite 接口函数的调用覆盖或释放。
sqlite3_errstr(E) 接口返回描述 结果代码 E 的英文文本,以 UTF-8 格式,或者如果 E 不是具有文本错误消息的可用结果代码则返回 NULL。用于保存错误消息字符串的内存由内部管理,不得由应用程序释放。
如果最近的错误引用了输入 SQL 中的特定标记,则 sqlite3_error_offset() 接口将返回该标记开头的字节偏移量。sqlite3_error_offset() 返回的字节偏移量假定输入 SQL 是 UTF8。如果最近的错误没有引用输入 SQL 中的特定标记,则 sqlite3_error_offset() 函数将返回 -1。
当使用序列化 线程模式 时,可能发生在第一个错误发生时间和调用这些接口之间的时间内,在另一个线程上发生第二个错误。发生这种情况时,将报告第二个错误,因为这些接口始终报告最新的结果。为了避免这种情况,每个线程可以通过在开始使用 D 之前调用 sqlite3_mutex_enter(sqlite3_db_mutex(D)),并在完成对此处列出的接口的所有调用后调用 sqlite3_mutex_leave(sqlite3_db_mutex(D)) 来获得对 数据库连接 D 的独占使用权。
如果接口以 SQLITE_MISUSE 失败,则意味着该接口被应用程序错误调用。在这种情况下,错误代码和消息可能已设置也可能未设置。