SQlite数据库的C编程接口(六) 返回值和错误码(Result Codes and Error Codes) ——《Using SQlite》读书笔记
SQlite数据库的C编程接口(六) 返回值和错误码(Result Codes and Error Codes) by斜风细雨QQ:253786989 2012-02-07
标准码(Standard Codes)
下面是标准的返回值和错误码定义:
#define SQLITE_OK 0 /* Successful result */
/* beginning-of-error-codes */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* Database is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_FORMAT 24 /* Auxiliary database format error */
#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB 26 /* File opened that is not a database file */
#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */
/* end-of-error-codes */
其中有些常量只由具体的某个函数返回,比如SQLITE_RANGE只会由sqlite3_bind_xxx函数返回。还有一些常量,比如SQLITE_ERROR只能说明函数在执行过程中发生了错误,但无法知道错误发生的原因。
SQLITE_MISUSE代表API被误用。比如一条语句在sqlite3_step函数执行之后,没有被重置之前,再次给其绑定参数,这时bind函数就会返回SQLITE_MISUSE。
扩展码(Extended Codes)
标准错误码对于错误发生的原因,所提供的信息比较少。所以有时候,我们会使用扩展的错误码。扩展错误码是以标准错误码为基础,其低阶字节就是原本的标准错误码,然后在其高阶字节“或”上附加信息,描述错误发生的细节。
int sqlite3_extended_result_codes(sqlite3*, int onoff);
因为考虑到客户旧程序的兼容性问题,默认情况下,这些扩展的错误码是没有启用的。程序员可以通过sqlite3_extended_result_codes函数启用或者关闭扩展错误码。
下面是所有的扩展错误码(其中大部分用来描述SQLITE_IOERR):
#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))
#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))
#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8))
#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8))
#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8))
#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8))
#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8))
#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8))
#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8))
#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8))
#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8))
#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8))
#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8))
#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8))
#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8))
#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8))
#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8))
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
Error相关函数(Error Functions)
int sqlite3_extended_result_codes(sqlite3*, int onoff);
针对某个数据库连接,启用或关闭扩展错误码的使用。通过给sqlite3_extended_result_codes函数的第2个参数传递非零值来启用扩展错误码。该函数总是返回SQLITE_OK,没有什么途径可以获取扩展错误码当前是否启用或关闭。
int sqlite3_errcode(sqlite3 *db);
如果某个数据库函数操作没有返回SQLITE_OK,那么可以随后调用该函数获取错误码。默认情况下它返回标准错误码,如果当前数据库连接已经启用了扩展错误码,那么该函数也可能会返回一个扩展的错误码。
int sqlite3_extended_errcode(sqlite3 *db);
与sqlite3_errcode函数类似,只不过该函数只会返回扩展的错误码。
const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);
返回错误码字符串,使用UTF-8或者UTF-16编码。程序员应该在调用这两个函数,获取错误码信息之后立刻使用,或者做一个拷贝。因为下一个数据库操作就可能会导致返回的字符串指针失效。
SQlite错误处理不能够同时处理多个错误,比如某个API函数调用发生了错误,而程序员没有对该错误进行检查处理,那么下一次API函数调用就很可能返回SQLITE_MISUSE,表明程序试图使用一个无效的数据结构。所以程序员应该在每次API函数调用之后检查和处理任何可能发生的错误。
另外,如果多个线程分享同一个数据库连接,最好将核心的API调用和错误处理部分的代码封装在关键代码区(critical section)中。程序员可以使用sqlite3_db_mutex函数获取数据库连接的互斥锁指针(一个指向sqlite3_mutex对象的指针)。
V2版本的prepare函数(Prepare v2)
下表是原版本的prepare函数和v2版本的prepare函数的比较:
V2版本的prepare函数对于错误处理更简洁,还有上表中列出的关于schema的优点,所以推荐使用v2版本的prepare函数。
事务和错误(Transactions and Errors)
通常,SQlite操作处于自动提交模式。SQlite自动把每一个SQL命令封装进事务中。如果每条语句都被封装进它自己的事务中,那错误恢复就简单了。任何时候只要SQLite发现它自己处于错误状态,只要简单的回滚当前事务就可以了。这样就可以有效的取消当前SQL命令,并使数据库回到出错之前的状态。
然而,一旦BEGIN TRANSACTION命令执行,SQlite就不在处于自动提交模式。一个事务被打开,将一直保持打开状态直到END TRANSACTION或者COMMIT TRANSACTION命令执行。这就允许多条SQL命令封装进一个事务中,使一系列离散的命令要么全都执行,要么都不执行(原子操作),不过这也限制了SQLite的错误恢复。
当一个显示的(explicit)事务执行过程中遇到一个错误,SQLite试图取消刚刚执行的语句。不幸的是,这并不总是可能的。如果事情很糟,SQlite有时候只能回退整个当前事务,没有其他选择。
最有可能导致回滚的错误是SQLITE_FULL(数据库或磁盘空间已满),SQLITE_IOERR(磁盘IO错误或文件被锁定),SQLITE_BUSY(数据库锁定),SQLITE_NOMEM(内存不足),SQLITE_INTERRUPT(中断)。如果程序正在执行一个显示事务,并且收到这些错误之一,那就要准备好处理可能将发生的事务回滚。
int sqlite3_get_autocommit(sqlite3*);
通过该函数,可以获取当前的提交状态。如果返回非0值,则数据库处于自动提交(atutoconmit)模式。如果返回0,则数据库正处于一个显示事务之中(the database is currently inside an explicit transaction)。
如果SQlite数据库被强制做了一次完全事务回滚操作,则数据库将再次变为事务自动提交模式。如果数据库不在自动提交模式,则它肯定处于一个事务之中,表明并不需要回滚。
SQlite数据库的C编程接口(六) 返回值和错误码(Result Codes and Error Codes) by斜风细雨QQ:253786989 2012-02-07
SQlite数据库的C编程接口(六) 返回值和错误码(Result Codes and Error Codes) ——《Using SQlite》读书笔记相关推荐
- LY.JAVA面向对象编程.形式参数和返回值
2018-07-09 13:29:16 运动员和教练案例 1 /* 2 教练和运动员案例(学生分析然后讲解) 3 乒乓球运动员和篮球运动员. 4 乒乓球教练和篮球教练. 5 为了出国交流,跟乒乓球相关 ...
- 两个系统如何调用接口获取返回值
1.使用场景 两个公司进行合作,但是是两个毫不相关的项目,所以就需要使用http请求远程访问接口获取返回值. 2.如何做到 使用http请求建立连接访问接口获取返回值并解析 调用其他系统接口工具类如下 ...
- sendto 返回errnor 1,错误码1 Operation not permitted
使用udp套接字发送失败,返回-1,错误码为1,ping操作显示Operation not permitted 这个是防火墙导致的,使用iptables关掉防火墙去就没问题. iptables -F
- 程序的加载和执行(六)——《x86汇编语言:从实模式到保护模式》读书笔记26
程序的加载和执行(六)--<x86汇编语言:从实模式到保护模式>读书笔记26 通过本文能学到什么? NASM的条件汇编 用NASM编译的时候,通过命令行选项定义宏 Makefile的条件语 ...
- falsk 请求没有返回值报错
线上报警 5xx 错误,查看日志发现报这个错, TypeError: The view function did not return a valid response. The function e ...
- 微信支付-“申请退款”接口遇到curl出错,错误码:58解决方案
微信支付后 退款,接口遇到curl出错,错误码:58 这个问题基本上是证书没对应上(微信支付不需要申请证书,退款要用到证书),证书要去微信商户号后台(账户中心-API安全-申请证书)下载,已经下载过忘 ...
- 金仓数据库 KingbaseES 客户端编程接口指南 - JDBC(11. JDBC 示例说明)
11. JDBC 示例说明 在所提供的用例中,使用的数据库信息为,用户名:system; 密码:manager; 数据库名:test; 端口号:54321 数据源示例 连接池示例 Statement ...
- 金仓数据库KingbaseES客户端编程接口指南-DCI(3. DCI 工程配置)
3. DCI 工程配置¶ Windows 平台工程搭建(vs2008) Linux平台工程搭建 服务的配置方法与参数说明 多主机地址配置 3.1. Windows 平台工程搭建(VS2008) 3.2 ...
- JAVA接口返回面积_java – 将接口的返回值限制为实现类的范围
我正在编写一个小型库,我有一些接口提供了一个返回值应该在指定范围内的方法.我如何明确禁止实现此方法的库的用户返回不在此范围内的值? 像这样的东西: //Library interface Favori ...
- php请求api获取返回值,我用curl请求接口获取返回值,但是不成功,大神给看看怎么调取?...
接口地址 http://mp.vservice.com.cn/service/OutWebService?wsdl 接口调用方 callService(String serviceName,Strin ...
最新文章
- 【学习笔记】新基建/新动能——部分学习笔记
- [Go] golang设置运行的cpu数
- 两种方法用于检查传入的数字是否为整数
- 从printf谈可变参数函数的实现
- P2962 [USACO09NOV]灯Lights
- sql查询id最大的一行_mysql-聚合查询
- 3D Computer Grapihcs Using OpenGL - 18 相机移动
- 第 13 章 MEncoder的基础用法
- 五子课堂---第一课(连珠基础一)
- 江西科技师范大学泰豪校区计算机专业,扎心了!比取经还艰难的大学路,南昌居然占了这么多……...
- 欧美古风格html网站模板
- Python识别图片中数字/数值的方法笔记
- 注销 睡眠 休眠的区别
- 集成显卡和独立显卡的区别
- oracle.jdbc.OracleDriver Oracle数据库驱动
- [QNX Hypervisor 2.2用户手册]12.2 术语(二)
- 可以分屏的软件_mac必备软件
- 简练软考知识点整理-云大物移智区加
- “路漫漫其修远兮,吾将上下而求索”——读“做中学”有感 20155328
- Canvas 3D魔方小游戏
热门文章
- HTML连续英文字符串强制换行
- windows下双击可运行的Java软件打包方案
- Ubuntu 16.04安装SoapUI工具进行接口测试(Web Service/WSDL/RESTfull)
- SD-WAN+物联网:让城市更智慧
- 你觉得你非常了解Javascript?
- oracle rac的特征
- GitHub 引入缺陷和Pull Request 模版,并支持直接上传文件
- windows server 2008 搭建文件共享服务
- PHP 命令行之-F (--process-file) 对每个输入行都执行 PHP 文件 (PHP 5 新加)
- tomcat配置项目的接种方式