SQLLite (三):sqlite3_get_table,sqlite3_free_table

上一篇介绍的sqlite3_exec 是使用回调来执行对select结果的操作,你得声明一个函数,如果这个函数是类成员函数,你还不得不把它声明成static的(要问为什么?这又是C++基础了。C++成员函数实际上隐藏了一个参数:this,C++调用类的成员函数的时候,隐含把类指针当成函数的第一个参数传递进去。结果,这造成跟前面说的sqlite 回调函数的参数不相符。只有当把成员函数声明成static 时,它才没有多余的隐含的this参数)。

有时候你还是想要非回调的select 查询。这可以通过sqlite3_get_table 函数做到。

[cpp] view plaincopy
  1. int sqlite3_get_table(  
  2. 2   sqlite3 *db,          "color:#009900;">/* An open database */  
  3. 3   const char *zSql,     "color:#009900;">/* SQL to be evaluated */  
  4. 4   char ***pazResult,    "color:#009900;">/* Results of the query */  
  5. 5   int *pnRow,           "color:#009900;">/* Number of result rows written here */  
  6. 6   int *pnColumn,        "color:#009900;">/* Number of result columns written here */  
  7. 7   char **pzErrmsg       "color:#009900;">/* Error msg written here */  
  8. 8 );  
  9. void sqlite3_free_table(char **result);  

第1个参数不再多说,看前面的例子。 第2个参数是sql 语句,跟sqlite3_exec 里的sql 是一样的。是一个很普通的以\0结尾的char*字符串。 第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:字段名称,后面是紧接着是每个字段的值。下面用例子来说事。 第4个参数是查询出多少条记录(即查出多少行,不包括字段名那行)。 第5个参数是多少个字段(多少列)。 第6个参数是错误信息,跟前面一样,这里不多说了。

pazResult返回的字符串数量实际上是(*pnRow+1)*(*pnColumn),因为前(*pnColumn)个是字段名

修改上篇的例子,使用sqlite3_get_table,来去的结果集:

[cpp] view plaincopy
  1. #include   
  2.  2 using namespace std;  
  3.  3 #include "sqlite/sqlite3.h"  
  4.  4 int callback(void*,int,char**,char**);  
  5.  5 int main()  
  6.  6 {  
  7.  7     sqlite3* db;  
  8.  8     int nResult = sqlite3_open("test.db",&db);  
  9.  9     if (nResult != SQLITE_OK)  
  10. 10     {  
  11. 11         cout<<"打开数据库失败:"<
  12. 12         return 0;  
  13. 13     }  
  14. 14     else  
  15. 15     {  
  16. 16         cout<<"数据库打开成功"<
  17. 17     }  
  18. 18   
  19. 19     char* errmsg;  
  20. 20   
  21. 21     nResult = sqlite3_exec(db,"create table MyTable(id integer primary key autoincrement,name varchar(100))",NULL,NULL,&errmsg);  
  22. 22      if (nResult != SQLITE_OK)  
  23. 23      {  
  24. 24          sqlite3_close(db);  
  25. 25          cout<
  26. 26          sqlite3_free(errmsg);  
  27. 27         return 0;  
  28. 28     }  
  29. 29     string strSql;  
  30. 30     strSql+="begin;\n";  
  31. 31     for (int i=0;i<100;i++)  
  32. 32     {  
  33. 33         strSql+="insert into MyTable values(null,'heh');\n";  
  34. 34     }  
  35. 35     strSql+="commit;";  
  36. 36     //cout<  
  37. 37   
  38. 38     nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);  
  39. 39   
  40. 40     if (nResult != SQLITE_OK)  
  41. 41     {  
  42. 42         sqlite3_close(db);  
  43. 43         cout<
  44. 44         sqlite3_free(errmsg);  
  45. 45         return 0;  
  46. 46     }  
  47. 47   
  48. 48     strSql = "select * from MyTable";  
  49. "color:#009900;">49     //nResult = sqlite3_exec(db,strSql.c_str(),callback,NULL,&errmsg);  
  50. 50     char** pResult;  
  51. 51     int nRow;  
  52. 52     int nCol;  
  53. 53     nResult = sqlite3_get_table(db,strSql.c_str(),&pResult,&nRow,&nCol,&errmsg);  
  54. 54       if (nResult != SQLITE_OK)  
  55. 55     {  
  56. 56         sqlite3_close(db);  
  57. 57         cout<
  58. 58         sqlite3_free(errmsg);  
  59. 59         return 0;  
  60. 60     }  
  61. 61   
  62. 62     string strOut;  
  63. 63     int nIndex = nCol;  
  64. 64     for(int i=0;i
  65. 65     {  
  66. 66         for(int j=0;j
  67. 67         {  
  68. 68             strOut+=pResult[j];  
  69. 69             strOut+=":";  
  70. 70             strOut+=pResult[nIndex];  
  71. 71             strOut+="\n";  
  72. 72             ++nIndex;  
  73. 73         }  
  74. 74     }  
  75. 75     sqlite3_free_table(pResult);  
  76. 76     cout<
  77. 77     sqlite3_close(db);  
  78. 78     return 0;  
  79. 79 }  
  80. "color:#009900;">80 /* 
  81. 81 int callback(void* ,int nCount,char** pValue,char** pName) 
  82. 82 { 
  83. 83     string s; 
  84. 84     for(int i=0;i 
  85. 85     { 
  86. 86         s+=pName[i]; 
  87. 87         s+=":"; 
  88. 88         s+=pValue[i]; 
  89. 89         s+="\n"; 
  90. 90     } 
  91. 91     cout< 
  92. 92     return 0; 
  93. 93 }*/  

你可能感兴趣的:(SQLLite (三):sqlite3_get_table,sqlite3_free_table)