1. 程式人生 > >sqlite3 讀取表資料

sqlite3 讀取表資料

先上一段 sample
#include <stdio.h>
#include <string.h>
#include "sqlite3.h"

int main()
{
	sqlite3 *db;
	char *zErrMsg = 0;
	int rc;
	char **result;
	int row, column;
	int i, j;
	
	rc = sqlite3_open("gt_db.db", &db);
	if( rc ){
		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return -1;
	}	


	rc = sqlite3_get_table(db, "SELECT * FROM DeviceMap", &result, &row, &column, &zErrMsg);

	if (rc == SQLITE_OK) {
		printf("row = %d, column = %d\n", row, column);
		printf(result[0]);
		for (i = 0; i <= row; i++) {
			printf("----------- %d -------------\n", i);
			for (j = 0; j < column; j++) {
				printf("%s  ",  result[i*column + j]);
			}
		}
	}
	
	sqlite3_free_table(result);


	sqlite3_close(db);

	return 0;
}


其實,讀取表資料只要用 sqlite3_get_table 就可以了,當然,也可以用 sqlite3_exec 然後在回撥裡查。

官方的說明,講了一大堆,還舉了例項,就怕你看不懂,結果還真是越講越糊塗了。

SQLITE_API int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);


其實是要注意結構就明白了,舉個例子

      Name        | Age
        -----------------------
      Alice          | 43
       Bob          | 28
       Cindy       | 21


這個資料表裡,有兩個欄位 Name    和 Age,   那在一段記憶體裡怎麼表示呢?

其實就是用二維陣列。

pnRow ---   表示有幾條記錄;

pnColumn -- 表示有幾個內容,即有幾個欄位;

那在上面這個示例中

 pnRow = 3,    pnColumn = 2

如果我要取 Bob 這個人的記錄,則

(*pazResult)[pnColumn * 2 + 0]   取出名字  bob

(*pazResult)[pnColumn * 2 + 1]   取出年齡

這樣會不會比 sqlite3_exec 方便呢?

當然,查完之後,要用 sqlite3_free_table(result);  釋放掉佔用的記憶體