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

猜你在找的Sqlite相关文章