设为首页 收藏本站
查看: 1387|回复: 0

[经验分享] SQlite数据库的C编程接口(六) 返回值和错误码(Result Codes and Error Codes) ——《Using SQlite》读书笔记

[复制链接]

尚未签到

发表于 2016-11-30 08:50:27 | 显示全部楼层 |阅读模式
  SQlite数据库的C编程接口(六)返回值和错误码(Result Codes
and Error Codes) by斜风细雨QQ:253786989 2012-02-07

  标准码(StandardCodes
  下面是标准的返回值和错误码定义:

[cpp]
view plaincopyprint?





  • #defineSQLITE_OK0/*Successfulresult*/


  • /*beginning-of-error-codes*/

  • #defineSQLITE_ERROR1/*SQLerrorormissingdatabase*/


  • #defineSQLITE_INTERNAL2/*InternallogicerrorinSQLite*/


  • #defineSQLITE_PERM3/*Accesspermissiondenied*/


  • #defineSQLITE_ABORT4/*Callbackroutinerequestedanabort*/


  • #defineSQLITE_BUSY5/*Thedatabasefileislocked*/


  • #defineSQLITE_LOCKED6/*Atableinthedatabaseislocked*/


  • #defineSQLITE_NOMEM7/*Amalloc()failed*/


  • #defineSQLITE_READONLY8/*Attempttowriteareadonlydatabase*/


  • #defineSQLITE_INTERRUPT9/*Operationterminatedbysqlite3_interrupt()*/


  • #defineSQLITE_IOERR10/*SomekindofdiskI/Oerroroccurred*/


  • #defineSQLITE_CORRUPT11/*Thedatabasediskimageismalformed*/


  • #defineSQLITE_NOTFOUND12/*Unknownopcodeinsqlite3_file_control()*/


  • #defineSQLITE_FULL13/*Insertionfailedbecausedatabaseisfull*/


  • #defineSQLITE_CANTOPEN14/*Unabletoopenthedatabasefile*/


  • #defineSQLITE_PROTOCOL15/*Databaselockprotocolerror*/


  • #defineSQLITE_EMPTY16/*Databaseisempty*/


  • #defineSQLITE_SCHEMA17/*Thedatabaseschemachanged*/


  • #defineSQLITE_TOOBIG18/*StringorBLOBexceedssizelimit*/


  • #defineSQLITE_CONSTRAINT19/*Abortduetoconstraintviolation*/


  • #defineSQLITE_MISMATCH20/*Datatypemismatch*/


  • #defineSQLITE_MISUSE21/*Libraryusedincorrectly*/


  • #defineSQLITE_NOLFS22/*UsesOSfeaturesnotsupportedonhost*/


  • #defineSQLITE_AUTH23/*Authorizationdenied*/


  • #defineSQLITE_FORMAT24/*Auxiliarydatabaseformaterror*/


  • #defineSQLITE_RANGE25/*2ndparametertosqlite3_bindoutofrange*/


  • #defineSQLITE_NOTADB26/*Fileopenedthatisnotadatabasefile*/


  • #defineSQLITE_ROW100/*sqlite3_step()hasanotherrowready*/


  • #defineSQLITE_DONE101/*sqlite3_step()hasfinishedexecuting*/


  • /*end-of-error-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
  扩展码(ExtendedCodes
  标准错误码对于错误发生的原因,所提供的信息比较少。所以有时候,我们会使用扩展的错误码。扩展错误码是以标准错误码为基础,其低阶字节就是原本的标准错误码,然后在其高阶字节“或”上附加信息,描述错误发生的细节。


[cpp]
view plaincopyprint?





  • intsqlite3_extended_result_codes(sqlite3*,intonoff);



int sqlite3_extended_result_codes(sqlite3*, int onoff);
  因为考虑到客户旧程序的兼容性问题,默认情况下,这些扩展的错误码是没有启用的。程序员可以通过sqlite3_extended_result_codes函数启用或者关闭扩展错误码。
  下面是所有的扩展错误码(其中大部分用来描述SQLITE_IOERR):


[cpp]
view plaincopyprint?





  • #defineSQLITE_IOERR_READ(SQLITE_IOERR|(1<<8))


  • #defineSQLITE_IOERR_SHORT_READ(SQLITE_IOERR|(2<<8))


  • #defineSQLITE_IOERR_WRITE(SQLITE_IOERR|(3<<8))


  • #defineSQLITE_IOERR_FSYNC(SQLITE_IOERR|(4<<8))


  • #defineSQLITE_IOERR_DIR_FSYNC(SQLITE_IOERR|(5<<8))


  • #defineSQLITE_IOERR_TRUNCATE(SQLITE_IOERR|(6<<8))


  • #defineSQLITE_IOERR_FSTAT(SQLITE_IOERR|(7<<8))


  • #defineSQLITE_IOERR_UNLOCK(SQLITE_IOERR|(8<<8))


  • #defineSQLITE_IOERR_RDLOCK(SQLITE_IOERR|(9<<8))


  • #defineSQLITE_IOERR_DELETE(SQLITE_IOERR|(10<<8))


  • #defineSQLITE_IOERR_BLOCKED(SQLITE_IOERR|(11<<8))


  • #defineSQLITE_IOERR_NOMEM(SQLITE_IOERR|(12<<8))


  • #defineSQLITE_IOERR_ACCESS(SQLITE_IOERR|(13<<8))


  • #defineSQLITE_IOERR_CHECKRESERVEDLOCK(SQLITE_IOERR|(14<<8))


  • #defineSQLITE_IOERR_LOCK(SQLITE_IOERR|(15<<8))


  • #defineSQLITE_IOERR_CLOSE(SQLITE_IOERR|(16<<8))


  • #defineSQLITE_IOERR_DIR_CLOSE(SQLITE_IOERR|(17<<8))


  • #defineSQLITE_IOERR_SHMOPEN(SQLITE_IOERR|(18<<8))


  • #defineSQLITE_IOERR_SHMSIZE(SQLITE_IOERR|(19<<8))


  • #defineSQLITE_IOERR_SHMLOCK(SQLITE_IOERR|(20<<8))


  • #defineSQLITE_IOERR_SHMMAP(SQLITE_IOERR|(21<<8))


  • #defineSQLITE_IOERR_SEEK(SQLITE_IOERR|(22<<8))


  • #defineSQLITE_LOCKED_SHAREDCACHE(SQLITE_LOCKED|(1<<8))


  • #defineSQLITE_BUSY_RECOVERY(SQLITE_BUSY|(1<<8))


  • #defineSQLITE_CANTOPEN_NOTEMPDIR(SQLITE_CANTOPEN|(1<<8))


  • #defineSQLITE_CORRUPT_VTAB(SQLITE_CORRUPT|(1<<8))


  • #defineSQLITE_READONLY_RECOVERY(SQLITE_READONLY|(1<<8))


  • #defineSQLITE_READONLY_CANTLOCK(SQLITE_READONLY|(2<<8))



#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相关函数(ErrorFunctions


[cpp]
view plaincopyprint?





  • intsqlite3_extended_result_codes(sqlite3*,intonoff);



int sqlite3_extended_result_codes(sqlite3*, int onoff);
  针对某个数据库连接,启用或关闭扩展错误码的使用。通过给sqlite3_extended_result_codes函数的第2个参数传递非零值来启用扩展错误码。该函数总是返回SQLITE_OK,没有什么途径可以获取扩展错误码当前是否启用或关闭。


[cpp]
view plaincopyprint?





  • intsqlite3_errcode(sqlite3*db);



int sqlite3_errcode(sqlite3 *db);
  如果某个数据库函数操作没有返回SQLITE_OK,那么可以随后调用该函数获取错误码。默认情况下它返回标准错误码,如果当前数据库连接已经启用了扩展错误码,那么该函数也可能会返回一个扩展的错误码。


[cpp]
view plaincopyprint?





  • intsqlite3_extended_errcode(sqlite3*db);



int sqlite3_extended_errcode(sqlite3 *db);
  sqlite3_errcode函数类似,只不过该函数只会返回扩展的错误码。


[cpp]
view plaincopyprint?





  • constchar*sqlite3_errmsg(sqlite3*);

  • constvoid*sqlite3_errmsg16(sqlite3*);



const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);
  返回错误码字符串,使用UTF-8或者UTF-16编码。程序员应该在调用这两个函数,获取错误码信息之后立刻使用,或者做一个拷贝。因为下一个数据库操作就可能会导致返回的字符串指针失效。
  SQlite错误处理不能够同时处理多个错误,比如某个API函数调用发生了错误,而程序员没有对该错误进行检查处理,那么下一次API函数调用就很可能返回SQLITE_MISUSE,表明程序试图使用一个无效的数据结构。所以程序员应该在每次API函数调用之后检查和处理任何可能发生的错误。
  另外,如果多个线程分享同一个数据库连接,最好将核心的API调用和错误处理部分的代码封装在关键代码区(criticalsection)中。程序员可以使用sqlite3_db_mutex函数获取数据库连接的互斥锁指针(一个指向sqlite3_mutex对象的指针)。
  V2版本的prepare函数(Preparev2
  下表是原版本的prepare函数和v2版本的prepare函数的比较:
   DSC0000.gif
  V2版本的prepare函数对于错误处理更简洁,还有上表中列出的关于schema的优点,所以推荐使用v2版本的prepare函数。
  事务和错误(TransactionsandErrors
  通常,SQlite操作处于自动提交模式。SQlite自动把每一个SQL命令封装进事务中。如果每条语句都被封装进它自己的事务中,那错误恢复就简单了。任何时候只要SQLite发现它自己处于错误状态,只要简单的回滚当前事务就可以了。这样就可以有效的取消当前SQL命令,并使数据库回到出错之前的状态。
  然而,一旦BEGINTRANSACTION命令执行,SQlite就不在处于自动提交模式。一个事务被打开,将一直保持打开状态直到ENDTRANSACTION或者COMMITTRANSACTION命令执行。这就允许多条SQL命令封装进一个事务中,使一系列离散的命令要么全都执行,要么都不执行(原子操作),不过这也限制了SQLite的错误恢复。
  当一个显示的(explicit)事务执行过程中遇到一个错误,SQLite试图取消刚刚执行的语句。不幸的是,这并不总是可能的。如果事情很糟,SQlite有时候只能回退整个当前事务,没有其他选择。
  最有可能导致回滚的错误是SQLITE_FULL(数据库或磁盘空间已满),SQLITE_IOERR(磁盘IO错误或文件被锁定),SQLITE_BUSY(数据库锁定),SQLITE_NOMEM(内存不足),SQLITE_INTERRUPT(中断)。如果程序正在执行一个显示事务,并且收到这些错误之一,那就要准备好处理可能将发生的事务回滚。


[cpp]
view plaincopyprint?





  • intsqlite3_get_autocommit(sqlite3*);



int sqlite3_get_autocommit(sqlite3*);
  通过该函数,可以获取当前的提交状态。如果返回非0值,则数据库处于自动提交(atutoconmit)模式。如果返回0,则数据库正处于一个显示事务之中(thedatabaseiscurrentlyinsideanexplicittransaction)。
  如果SQlite数据库被强制做了一次完全事务回滚操作,则数据库将再次变为事务自动提交模式。如果数据库不在自动提交模式,则它肯定处于一个事务之中,表明并不需要回滚。


  SQlite数据库的C编程接口(六)返回值和错误码(Result Codes
and Error Codes) by斜风细雨QQ:253786989 2012-02-07



  SQlite数据库的C编程接口(六)返回值和错误码(Result Codes
and Error Codes) by斜风细雨QQ:253786989 2012-02-07

  标准码(StandardCodes
  下面是标准的返回值和错误码定义:

[cpp]
view plaincopyprint?





  • #defineSQLITE_OK0/*Successfulresult*/


  • /*beginning-of-error-codes*/

  • #defineSQLITE_ERROR1/*SQLerrorormissingdatabase*/


  • #defineSQLITE_INTERNAL2/*InternallogicerrorinSQLite*/


  • #defineSQLITE_PERM3/*Accesspermissiondenied*/


  • #defineSQLITE_ABORT4/*Callbackroutinerequestedanabort*/


  • #defineSQLITE_BUSY5/*Thedatabasefileislocked*/


  • #defineSQLITE_LOCKED6/*Atableinthedatabaseislocked*/


  • #defineSQLITE_NOMEM7/*Amalloc()failed*/


  • #defineSQLITE_READONLY8/*Attempttowriteareadonlydatabase*/


  • #defineSQLITE_INTERRUPT9/*Operationterminatedbysqlite3_interrupt()*/


  • #defineSQLITE_IOERR10/*SomekindofdiskI/Oerroroccurred*/


  • #defineSQLITE_CORRUPT11/*Thedatabasediskimageismalformed*/


  • #defineSQLITE_NOTFOUND12/*Unknownopcodeinsqlite3_file_control()*/


  • #defineSQLITE_FULL13/*Insertionfailedbecausedatabaseisfull*/


  • #defineSQLITE_CANTOPEN14/*Unabletoopenthedatabasefile*/


  • #defineSQLITE_PROTOCOL15/*Databaselockprotocolerror*/


  • #defineSQLITE_EMPTY16/*Databaseisempty*/


  • #defineSQLITE_SCHEMA17/*Thedatabaseschemachanged*/


  • #defineSQLITE_TOOBIG18/*StringorBLOBexceedssizelimit*/


  • #defineSQLITE_CONSTRAINT19/*Abortduetoconstraintviolation*/


  • #defineSQLITE_MISMATCH20/*Datatypemismatch*/


  • #defineSQLITE_MISUSE21/*Libraryusedincorrectly*/


  • #defineSQLITE_NOLFS22/*UsesOSfeaturesnotsupportedonhost*/


  • #defineSQLITE_AUTH23/*Authorizationdenied*/


  • #defineSQLITE_FORMAT24/*Auxiliarydatabaseformaterror*/


  • #defineSQLITE_RANGE25/*2ndparametertosqlite3_bindoutofrange*/


  • #defineSQLITE_NOTADB26/*Fileopenedthatisnotadatabasefile*/


  • #defineSQLITE_ROW100/*sqlite3_step()hasanotherrowready*/


  • #defineSQLITE_DONE101/*sqlite3_step()hasfinishedexecuting*/


  • /*end-of-error-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
  扩展码(ExtendedCodes
  标准错误码对于错误发生的原因,所提供的信息比较少。所以有时候,我们会使用扩展的错误码。扩展错误码是以标准错误码为基础,其低阶字节就是原本的标准错误码,然后在其高阶字节“或”上附加信息,描述错误发生的细节。


[cpp]
view plaincopyprint?





  • intsqlite3_extended_result_codes(sqlite3*,intonoff);



int sqlite3_extended_result_codes(sqlite3*, int onoff);
  因为考虑到客户旧程序的兼容性问题,默认情况下,这些扩展的错误码是没有启用的。程序员可以通过sqlite3_extended_result_codes函数启用或者关闭扩展错误码。
  下面是所有的扩展错误码(其中大部分用来描述SQLITE_IOERR):


[cpp]
view plaincopyprint?





  • #defineSQLITE_IOERR_READ(SQLITE_IOERR|(1<<8))


  • #defineSQLITE_IOERR_SHORT_READ(SQLITE_IOERR|(2<<8))


  • #defineSQLITE_IOERR_WRITE(SQLITE_IOERR|(3<<8))


  • #defineSQLITE_IOERR_FSYNC(SQLITE_IOERR|(4<<8))


  • #defineSQLITE_IOERR_DIR_FSYNC(SQLITE_IOERR|(5<<8))


  • #defineSQLITE_IOERR_TRUNCATE(SQLITE_IOERR|(6<<8))


  • #defineSQLITE_IOERR_FSTAT(SQLITE_IOERR|(7<<8))


  • #defineSQLITE_IOERR_UNLOCK(SQLITE_IOERR|(8<<8))


  • #defineSQLITE_IOERR_RDLOCK(SQLITE_IOERR|(9<<8))


  • #defineSQLITE_IOERR_DELETE(SQLITE_IOERR|(10<<8))


  • #defineSQLITE_IOERR_BLOCKED(SQLITE_IOERR|(11<<8))


  • #defineSQLITE_IOERR_NOMEM(SQLITE_IOERR|(12<<8))


  • #defineSQLITE_IOERR_ACCESS(SQLITE_IOERR|(13<<8))


  • #defineSQLITE_IOERR_CHECKRESERVEDLOCK(SQLITE_IOERR|(14<<8))


  • #defineSQLITE_IOERR_LOCK(SQLITE_IOERR|(15<<8))


  • #defineSQLITE_IOERR_CLOSE(SQLITE_IOERR|(16<<8))


  • #defineSQLITE_IOERR_DIR_CLOSE(SQLITE_IOERR|(17<<8))


  • #defineSQLITE_IOERR_SHMOPEN(SQLITE_IOERR|(18<<8))


  • #defineSQLITE_IOERR_SHMSIZE(SQLITE_IOERR|(19<<8))


  • #defineSQLITE_IOERR_SHMLOCK(SQLITE_IOERR|(20<<8))


  • #defineSQLITE_IOERR_SHMMAP(SQLITE_IOERR|(21<<8))


  • #defineSQLITE_IOERR_SEEK(SQLITE_IOERR|(22<<8))


  • #defineSQLITE_LOCKED_SHAREDCACHE(SQLITE_LOCKED|(1<<8))


  • #defineSQLITE_BUSY_RECOVERY(SQLITE_BUSY|(1<<8))


  • #defineSQLITE_CANTOPEN_NOTEMPDIR(SQLITE_CANTOPEN|(1<<8))


  • #defineSQLITE_CORRUPT_VTAB(SQLITE_CORRUPT|(1<<8))


  • #defineSQLITE_READONLY_RECOVERY(SQLITE_READONLY|(1<<8))


  • #defineSQLITE_READONLY_CANTLOCK(SQLITE_READONLY|(2<<8))



#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相关函数(ErrorFunctions


[cpp]
view plaincopyprint?





  • intsqlite3_extended_result_codes(sqlite3*,intonoff);



int sqlite3_extended_result_codes(sqlite3*, int onoff);
  针对某个数据库连接,启用或关闭扩展错误码的使用。通过给sqlite3_extended_result_codes函数的第2个参数传递非零值来启用扩展错误码。该函数总是返回SQLITE_OK,没有什么途径可以获取扩展错误码当前是否启用或关闭。


[cpp]
view plaincopyprint?





  • intsqlite3_errcode(sqlite3*db);



int sqlite3_errcode(sqlite3 *db);
  如果某个数据库函数操作没有返回SQLITE_OK,那么可以随后调用该函数获取错误码。默认情况下它返回标准错误码,如果当前数据库连接已经启用了扩展错误码,那么该函数也可能会返回一个扩展的错误码。


[cpp]
view plaincopyprint?





  • intsqlite3_extended_errcode(sqlite3*db);



int sqlite3_extended_errcode(sqlite3 *db);
  sqlite3_errcode函数类似,只不过该函数只会返回扩展的错误码。


[cpp]
view plaincopyprint?





  • constchar*sqlite3_errmsg(sqlite3*);

  • constvoid*sqlite3_errmsg16(sqlite3*);



const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);
  返回错误码字符串,使用UTF-8或者UTF-16编码。程序员应该在调用这两个函数,获取错误码信息之后立刻使用,或者做一个拷贝。因为下一个数据库操作就可能会导致返回的字符串指针失效。
  SQlite错误处理不能够同时处理多个错误,比如某个API函数调用发生了错误,而程序员没有对该错误进行检查处理,那么下一次API函数调用就很可能返回SQLITE_MISUSE,表明程序试图使用一个无效的数据结构。所以程序员应该在每次API函数调用之后检查和处理任何可能发生的错误。
  另外,如果多个线程分享同一个数据库连接,最好将核心的API调用和错误处理部分的代码封装在关键代码区(criticalsection)中。程序员可以使用sqlite3_db_mutex函数获取数据库连接的互斥锁指针(一个指向sqlite3_mutex对象的指针)。
  V2版本的prepare函数(Preparev2
  下表是原版本的prepare函数和v2版本的prepare函数的比较:
  
  V2版本的prepare函数对于错误处理更简洁,还有上表中列出的关于schema的优点,所以推荐使用v2版本的prepare函数。
  事务和错误(TransactionsandErrors
  通常,SQlite操作处于自动提交模式。SQlite自动把每一个SQL命令封装进事务中。如果每条语句都被封装进它自己的事务中,那错误恢复就简单了。任何时候只要SQLite发现它自己处于错误状态,只要简单的回滚当前事务就可以了。这样就可以有效的取消当前SQL命令,并使数据库回到出错之前的状态。
  然而,一旦BEGINTRANSACTION命令执行,SQlite就不在处于自动提交模式。一个事务被打开,将一直保持打开状态直到ENDTRANSACTION或者COMMITTRANSACTION命令执行。这就允许多条SQL命令封装进一个事务中,使一系列离散的命令要么全都执行,要么都不执行(原子操作),不过这也限制了SQLite的错误恢复。
  当一个显示的(explicit)事务执行过程中遇到一个错误,SQLite试图取消刚刚执行的语句。不幸的是,这并不总是可能的。如果事情很糟,SQlite有时候只能回退整个当前事务,没有其他选择。
  最有可能导致回滚的错误是SQLITE_FULL(数据库或磁盘空间已满),SQLITE_IOERR(磁盘IO错误或文件被锁定),SQLITE_BUSY(数据库锁定),SQLITE_NOMEM(内存不足),SQLITE_INTERRUPT(中断)。如果程序正在执行一个显示事务,并且收到这些错误之一,那就要准备好处理可能将发生的事务回滚。


[cpp]
view plaincopyprint?





  • intsqlite3_get_autocommit(sqlite3*);



int sqlite3_get_autocommit(sqlite3*);
  通过该函数,可以获取当前的提交状态。如果返回非0值,则数据库处于自动提交(atutoconmit)模式。如果返回0,则数据库正处于一个显示事务之中(thedatabaseiscurrentlyinsideanexplicittransaction)。
  如果SQlite数据库被强制做了一次完全事务回滚操作,则数据库将再次变为事务自动提交模式。如果数据库不在自动提交模式,则它肯定处于一个事务之中,表明并不需要回滚。


  SQlite数据库的C编程接口(六)返回值和错误码(Result Codes
and Error Codes) by斜风细雨QQ:253786989 2012-02-07

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307452-1-1.html 上篇帖子: sqlite alter table改变某一列 下篇帖子: 开发SQLite数据库常用的管理工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表