分享

不推荐使用sqlite3_get_table,而是使用sqlite3_prepare_v2替代

 XeonGate 2019-10-24

https://blog.csdn.net/mindlead/article/details/51648649

原来一直使用sqlite3_get_table,发现效率低下,而且官方推荐使用sqlite3_prepare_v2替代,特继续学习

  1. #include "sqlite3.h"
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <assert.h>
  5. #pragma comment(lib, "sqlite3.lib")
  6. typedef struct per
  7. {
  8. char *name;
  9. int age;
  10. char *sex;
  11. } per;
  12. per a[] = {
  13. "David",22,"man",
  14. "Eve",28,"man",
  15. "Frand",21,"woman"
  16. };
  17. // 这个函数可以用来打印出每行的信息
  18. static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  19. int i;
  20. for(i=0; i<argc; i++){
  21. printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  22. }
  23. printf("\n");
  24. return 0;
  25. }
  26. int main()
  27. {
  28. sqlite3 *pdb;
  29. char *zErrMsg;
  30. sqlite3_stmt *pstmt;
  31. const char *pzTail;
  32. const unsigned char *pTmp;
  33. int age;
  34. int nCol;
  35. // 打开数据库连接
  36. int nRet = sqlite3_open("e:\\db\\people.db",&pdb);
  37. assert(SQLITE_OK == nRet);
  38. // 创建表
  39. const char *sql = "CREATE TABLE IF NOT EXISTS person(name VARCHAR(128),"
  40. "age INTEGER,"
  41. "sex VARCHAR(7)"
  42. ");";
  43. nRet = sqlite3_exec(pdb,sql,NULL,NULL,&zErrMsg);
  44. if (nRet != SQLITE_OK)
  45. {
  46. printf("%s\n",zErrMsg);
  47. sqlite3_close(pdb);
  48. return 1;
  49. }
  50. sql = "DELETE FROM person;";
  51. nRet = sqlite3_exec(pdb,sql,NULL,NULL,&zErrMsg);
  52. if (nRet != SQLITE_OK)
  53. {
  54. printf("%s\n",zErrMsg);
  55. sqlite3_close(pdb);
  56. return 1;
  57. }
  58. // 使用sqlite3_exec() 插入数据
  59. sql = "INSERT INTO person(name,age,sex) VALUES(\"Alice\",15,\"woman\");";
  60. nRet = sqlite3_exec(pdb,sql,NULL,NULL,&zErrMsg);
  61. assert(SQLITE_OK == nRet); // 为了简单,这里不打印zErrMsg的值
  62. sql = "INSERT INTO person(name,age,sex) VALUES(\"Bob\",18,\"man\");";
  63. nRet = sqlite3_exec(pdb,sql,NULL,NULL,&zErrMsg);
  64. assert(SQLITE_OK == nRet); // 为了简单,这里不打印zErrMsg的值
  65. sql = "INSERT INTO person(name,age,sex) VALUES(\"Charli\",11,\"man\");";
  66. nRet = sqlite3_exec(pdb,sql,NULL,NULL,&zErrMsg);
  67. assert(SQLITE_OK == nRet); // 为了简单,这里不打印zErrMsg的值
  68. // 使用sqlite3_exec() 查询数据
  69. printf("=====query by sqlite3_exec()=====\n");
  70. sql = "SELECT name,age,sex FROM person;";
  71. nRet = sqlite3_exec(pdb,sql,callback,NULL,&zErrMsg);
  72. assert(SQLITE_OK == nRet);
  73. // 使用sqlite3_prepare_v2(), sqlite3_bind_...() 插入数据
  74. sql = "INSERT INTO person(name,age,sex) VALUES(?,?,?);";
  75. nRet = sqlite3_prepare_v2(pdb,sql,strlen(sql),&pstmt,&pzTail);
  76. assert(SQLITE_OK == nRet);
  77. int i;
  78. for (i=0;i<sizeof(a)/sizeof(per);i++)
  79. {
  80. nCol = 1;
  81. sqlite3_bind_text(pstmt,nCol++,a[i].name,strlen(a[i].name),NULL);
  82. sqlite3_bind_int(pstmt,nCol++,a[i].age);
  83. sqlite3_bind_text(pstmt,nCol++,a[i].sex,strlen(a[i].sex),NULL);
  84. sqlite3_step(pstmt);
  85. sqlite3_reset(pstmt);
  86. }
  87. sqlite3_finalize(pstmt);
  88. // 使用sqlite3_prepare_v2(), sqlite3_column_...() 查询数据
  89. printf("====== query by sqlite3_prepare_v2()======\n");
  90. sql = "SELECT name,age,sex FROM person;";
  91. nRet = sqlite3_prepare_v2(pdb,sql,strlen(sql),&pstmt,&pzTail);
  92. assert(SQLITE_OK == nRet);
  93. while(sqlite3_step(pstmt) == SQLITE_ROW)
  94. {
  95. nCol = 0;
  96. pTmp = sqlite3_column_text(pstmt,nCol++);
  97. printf("%s|",pTmp);
  98. age = sqlite3_column_int(pstmt,nCol++);
  99. printf("%d|",age);
  100. pTmp = sqlite3_column_text(pstmt,nCol++);
  101. printf("%s\n",pTmp);
  102. }
  103. sqlite3_finalize(pstmt);
  104. sqlite3_close(pdb);
  105. return 0;
  106. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多