Example.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. #if 0 // 示例查询方式,本项目中不能运行;
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "sqlite3.h"
  6. //
  7. //typedef int (*sqlite3_callback)(
  8. // void* data, /* Data provided in the 4th argument of sqlite3_exec() */
  9. // int ncols, /* The number of columns in row */
  10. // char** values, /* An array of strings representing fields in the row */
  11. // char** headers /* An array of strings representing column names */
  12. //);
  13. int callback(void* data, int ncols, char** values, char** headers)
  14. {
  15. int i;
  16. int len =0;
  17. int ll=0;
  18. for(i=0; i < ncols; i++)
  19. {
  20. if(strlen(headers[i])>len)
  21. len = strlen(headers[i]);
  22. }
  23. for(i=0; i < ncols; i++)
  24. {
  25. ll = len-strlen(headers[i]);
  26. while(ll)
  27. {
  28. fprintf(stdout," ");
  29. --ll;
  30. }
  31. fprintf(stdout, "%s: %s\n", headers[i], values[i]);
  32. }
  33. fprintf(stdout, "\n");
  34. return 0;
  35. }
  36. /************************************************************************/
  37. /* 函数:search_by_callback[11/13/2016 IT];
  38. /* 描述:按回调函数来查询表数据;
  39. /* 参数:;
  40. /* [IN] :;
  41. /* [OUT] :;
  42. /* [IN/OUT] :;
  43. /* 返回:void;
  44. /* 注意:;
  45. /* 示例:;
  46. /*
  47. /* 修改:;
  48. /* 日期:;
  49. /* 内容:;
  50. /************************************************************************/
  51. int search_by_callback(const char* db_name, const char* sql_cmd)
  52. {
  53. int i = 0 ;
  54. int j = 0 ;
  55. int nrow = 0, ncolumn = 0;
  56. char **azResult; //二维数组存放结果
  57. sqlite3 *db=NULL;
  58. char *zErrMsg = 0;
  59. int rc;
  60. int len=0;
  61. if(access(db_name, 0) == -1)
  62. {
  63. fprintf(stderr, "%s not found\n", db_name);
  64. return -1;
  65. }
  66. rc = sqlite3_open(db_name, &db);
  67. if( rc != SQLITE_OK)
  68. {
  69. fprintf(stderr, "%s open failed: %s\n", db_name,sqlite3_errmsg(db));
  70. sqlite3_close(db);
  71. return -1;
  72. }
  73. //查询数据
  74. rc = sqlite3_exec( db,sql_cmd, callback, NULL, &zErrMsg );
  75. if( rc != SQLITE_OK)
  76. {
  77. fprintf(stderr, "%s %s: %s\n", db_name,sql_cmd, sqlite3_errmsg(db));
  78. if(zErrMsg)
  79. {
  80. fprintf(stderr,"ErrMsg = %s \n", zErrMsg);
  81. sqlite3_free(zErrMsg);
  82. }
  83. sqlite3_close(db);
  84. return -1;
  85. }
  86. if(zErrMsg)
  87. {
  88. sqlite3_free(zErrMsg);
  89. }
  90. //关闭数据库
  91. sqlite3_close(db);
  92. return 0;
  93. }
  94. /************************************************************************/
  95. /* 函数:search_by_table[11/13/2016 IT];
  96. /* 描述:按sqlite3_get_table函数来查询表数据;
  97. /* 参数:;
  98. /* [IN] :;
  99. /* [OUT] :;
  100. /* [IN/OUT] :;
  101. /* 返回:void;
  102. /* 注意:;
  103. /* 示例:;
  104. /*
  105. /* 修改:;
  106. /* 日期:;
  107. /* 内容:;
  108. /************************************************************************/
  109. int search_by_table(const char* db_name, const char* sql_cmd)
  110. {
  111. int i = 0 ;
  112. int j = 0 ;
  113. int nrow = 0, ncolumn = 0;
  114. char **azResult; //二维数组存放结果
  115. sqlite3 *db=NULL;
  116. char *zErrMsg = 0;
  117. int rc;
  118. int len=0;
  119. if(access(db_name, 0) == -1)
  120. {
  121. fprintf(stderr, "%s not found\n", db_name);
  122. return -1;
  123. }
  124. rc = sqlite3_open(db_name, &db);
  125. if( rc != SQLITE_OK)
  126. {
  127. fprintf(stderr, "%s open failed: %s\n", db_name,sqlite3_errmsg(db));
  128. sqlite3_close(db);
  129. return -1;
  130. }
  131. //查询数据
  132. rc = sqlite3_get_table( db , sql_cmd, &azResult , &nrow , &ncolumn , &zErrMsg );
  133. if( rc != SQLITE_OK)
  134. {
  135. fprintf(stderr, "%s %s: %s\n", db_name,sql_cmd, sqlite3_errmsg(db));
  136. if(zErrMsg)
  137. fprintf(stderr,"ErrMsg = %s \n", zErrMsg);
  138. sqlite3_free_table( azResult );
  139. sqlite3_close(db);
  140. return -1;
  141. }
  142. for(j=0; j < ncolumn; j++)
  143. {
  144. if(strlen(azResult[j])>len)
  145. len = strlen(azResult[j]);
  146. }
  147. //从第0索引到第 nColumn - 1索引都是字段名称
  148. //从第 nColumn 索引开始,后面都是字段值
  149. for( i = 0 ; i < nrow; i++ )
  150. {
  151. for(j=0; j < ncolumn; j++)
  152. {
  153. int ll = (len- strlen(azResult[j]));
  154. while(ll)
  155. {
  156. printf(" ");
  157. --ll;
  158. }
  159. printf( "%s: %s\n", azResult[j], azResult[(i+1)*ncolumn+j]);
  160. }
  161. printf("\n");
  162. }
  163. #if 0
  164. for( j = 0 ; j < ncolumn; j++ )
  165. {
  166. printf( "%s ", azResult[j]);
  167. }
  168. printf( "\n");
  169. for( i=ncolumn ; i<( nrow + 1 ) * ncolumn ; i++ )
  170. {
  171. if(((i-ncolumn+1)%ncolumn) ==0)
  172. printf( "%s\n",azResult[i]);
  173. else
  174. printf( "%s ",azResult[i] );
  175. }
  176. #endif
  177. //与sqlite3_get_table对应,释放掉 azResult 的内存空间
  178. sqlite3_free_table( azResult );
  179. //关闭数据库
  180. sqlite3_close(db);
  181. return 0;
  182. }
  183. /************************************************************************/
  184. /* 函数:search_by_stmt[11/13/2016 IT];
  185. /* 描述:按sqlite3_prepare_v2函数来查询表数据;
  186. /* 参数:;
  187. /* [IN] :;
  188. /* [OUT] :;
  189. /* [IN/OUT] :;
  190. /* 返回:void;
  191. /* 注意:;
  192. /* 示例:;
  193. /*
  194. /* 修改:;
  195. /* 日期:;
  196. /* 内容:;
  197. /************************************************************************/
  198. int search_by_stmt(const char* db_name, const char* sql_cmd)
  199. {
  200. sqlite3 *db=NULL;
  201. sqlite3_stmt* stmt = 0;
  202. int ncolumn = 0;
  203. const char *column_name;
  204. int vtype , i;
  205. int rc;
  206. if(access(db_name, 0) == -1)
  207. {
  208. fprintf(stderr, "%s not found\n", db_name);
  209. return -1;
  210. }
  211. rc = sqlite3_open(db_name, &db);
  212. if( rc != SQLITE_OK)
  213. {
  214. fprintf(stderr, "%s open failed: %s\n", db_name,sqlite3_errmsg(db));
  215. sqlite3_close(db);
  216. return -1;
  217. }
  218. //查询数据
  219. rc = sqlite3_prepare_v2(db, sql_cmd, -1, &stmt, 0);
  220. if (rc != SQLITE_OK)
  221. {
  222. fprintf(stderr, "%s %s: %s\n", db_name,sql_cmd, sqlite3_errmsg(db));
  223. sqlite3_close(db);
  224. return -1;
  225. }
  226. ncolumn = sqlite3_column_count(stmt);
  227. while (sqlite3_step(stmt) == SQLITE_ROW)
  228. {
  229. for(i = 0 ; i < ncolumn ; i++ )
  230. {
  231. vtype = sqlite3_column_type(stmt , i);
  232. column_name = sqlite3_column_name(stmt , i);
  233. switch( vtype )
  234. {
  235. case SQLITE_NULL:
  236. fprintf(stdout, "%s: null\n", column_name);
  237. break;
  238. case SQLITE_INTEGER:
  239. fprintf(stdout, "%s: %d\n", column_name,sqlite3_column_int(stmt,i));
  240. break;
  241. case SQLITE_FLOAT:
  242. fprintf(stdout, "%s: %f\n", column_name,sqlite3_column_double(stmt,i));
  243. break;
  244. case SQLITE_BLOB: /* arguably fall through... */
  245. fprintf(stdout, "%s: BLOB\n", column_name);
  246. break;
  247. case SQLITE_TEXT:
  248. fprintf(stdout, "%s: %s\n", column_name,sqlite3_column_text(stmt,i));
  249. break;
  250. default:
  251. fprintf(stdout, "%s: ERROR [%s]\n", column_name, sqlite3_errmsg(db));
  252. break;
  253. }
  254. }
  255. }
  256. sqlite3_finalize(stmt);
  257. //关闭数据库
  258. sqlite3_close(db);
  259. return 0;
  260. }
  261. int main(int argc, char* argv[])
  262. {
  263. int i=0;
  264. if(argc != 4)
  265. {
  266. fprintf(stderr, "usage: %s [table/callback/stmt] <db_name> <sql_cmd>\r\n", argv[0]);
  267. return -1;
  268. }
  269. if((strcmp(argv[1],"table") ==0))
  270. search_by_table(argv[2],argv[3]);
  271. else if((strcmp(argv[1],"callback") ==0))
  272. search_by_callback(argv[2],argv[3]);
  273. else
  274. search_by_stmt(argv[2],argv[3]);
  275. return 0;
  276. }
  277. #endif