嵌入式 sqlite3中事务操作小结

前端之家收集整理的这篇文章主要介绍了嵌入式 sqlite3中事务操作小结前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在对sqlite3 insert into等操作时速度比较慢。

原因:它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。

解决办法:用事物的形式提交,因为开始事务后,进行的大量操作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。

接口:事务的操作没有特别的接口函数,就是一个普通的sql语句而已,分别如下:

intret;
ret=sqlite3_exec(db,"begin transaction"0&zErrorMsg);//开始一个事务

ret"commit transaction"提交事务"rollback transaction");


例程:在进行大量的操作前使用如下语句

retzErrorMsg);
for(...)
{
//insert into operate


如果操作错误)
}
ret);

代码功能

sql.txt中读出sql语句,并一一执行,若有一条执行失败,则所有执行全部不生效。回滚到执行前的状态。


  1. @H_502_187@#include<stdio.h>
  2. @H_502_187@#include<sqlite3.h>
  3. @H_502_187@#definesql_FILE"./sql.txt"
  4. @H_502_187@intcommitsql(sqlite3*db)
  5. @H_502_187@{
  6. intret=0;
  7. @H_502_187@FILE*fp;
  8. @H_502_187@
  9. charbuf[100]={0};
  10. char*errmsg=0;
  11. char**azResult;
  12. inti,nRow=0,nColumn=0;
  13. @H_502_187@fp=fopen(sql_FILE,"r");
  14. @H_502_187@if(NULL==fp)
  15. @H_502_187@return-1;
  16. @H_502_187@ret=sqlite3_exec(db,"BEGINEXCLUSIVE",NULL,&errmsg);
  17. if(ret!=sqlITE_OK)
  18. @H_502_187@{
  19. @H_502_187@printf("ret=%d,BEGINEXCLUSIVE:%s",ret,errmsg);
  20. @H_502_187@}
  21. while(NULL!=fgets(buf,100,fp))
  22. @H_502_187@printf("%s\n",buf);
  23. if(0==strncmp(buf,"select",6))
  24. @H_502_187@ret+=sqlite3_get_table(db,buf,&azResult,&nRow,&nColumn,&errmsg);
  25. ,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> @H_502_187@printf("row:%dcolumn=%d\n",nRow,nColumn);
  26. for(i=nColumn;i<(nRow+1)*nColumn;i++)
  27. @H_502_187@printf("azResult[%d]=%s\n",i,azResult[i]);
  28. @H_502_187@}
  29. @H_502_187@sqlite3_free_table(azResult);
  30. else
  31. @H_502_187@ret+=sqlite3_exec(db,&errmsg);
  32. if(sqlITE_OK!=ret)
  33. @H_502_187@printf("ret=%d,sql:%s\n",errmsg);
  34. break;
  35. if(ret==sqlITE_OK)
  36. "COMMIT",COMMIT:%s\n","ROLLBACK",ROLLBACK:%s\n",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> @H_502_187@sqlite3_free(errmsg);
  37. @H_502_187@fclose(fp);
  38. return-2;
  39. @H_502_187@
  40. returnret;
  41. intmain()
  42. @H_502_187@sqlite3*db;
  43. char*dbPath="test.db";
  44. intret=0;
  45. @H_502_187@ret=sqlite3_open(dbPath,&db);
  46. if(ret==sqlITE_OK)
  47. @H_502_187@printf("opensucceed\n");
  48. else
  49. @H_502_187@printf("openfail\n");
  50. @H_502_187@ret=commitsql(db);
  51. @H_502_187@printf("ret=%d\n",ret);
  52. @H_502_187@sqlite3_close(db);
  53. @H_502_187@}
原文链接:https://www.f2er.com/sqlite/200237.html

猜你在找的Sqlite相关文章