3 不使用回調查詢資料庫
" Z6 b. L" A' i8 M, w* d/ `- ^# T6 ?, F: H* m2 ~# ~
上面介紹的 sqlite3_exec 是使用回調來執行 select 操作。還有一個方法可以直接查詢而不需要回調。但是,我個人感覺還是回調好,因為代碼可以更加整齊,只不過用回調很麻煩,你得聲明一個函數,如果這個函數 是類成員函數,你還不得不把它聲明成 static 的(要問為什嗎?這又是C++基礎了。C++成員函數實際上隱藏了一個參數:this,C++調用類的成員函數的時候,隱含把類指標當成函數的第一個參數 傳遞進去。結果,這造成跟前面說的 sqlite 回呼函數的參數不相符。只有當把成員函式宣告成 static 時,它才沒有多餘的隱含的this參數)。9 s) ~, q% O, c
& M1 O7 u5 V8 E1 e- q
雖然回調顯得代碼整齊,但有時候你還是想要非回調的 select 查詢。這可以通過 sqlite3_get_table 函數做到。
複製內容到剪貼簿
代碼:
int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );
第1個參數不再多說,看前面的例子。 ?. x& [9 x, t% r5 o, J
* V* r) ?: Y6 l& r4 h第2個參數是 sql 語句,跟 sqlite3_exec 裡的 sql 是一樣的。是一個很普通的以\0結尾的char *字串。) w& d% I m$ ^0 N- S$ d
# r. z5 \# e' @/ U9 I
第3個參數是查詢結果,它依然一維數組(不要以為是二維數組,更不要以為是三維數組)。它記憶體布局是:第一行是欄位名稱,後面是緊接著是每個欄位的值。下面用例子來說事。8 Q6 D A1 f1 b# u) g; z9 I
1 {2 t9 L; }+ O. D. ]6 O8 l
第4個參數是查詢出多少條記錄(即查出多少行)。
( t1 o% r/ R( S' H/ @4 l; n3 g; ?+ p- s; e+ Z/ `1 |
第5個參數是多少個欄位(多少列)。! X3 M7 M& |$ _( M
/ o1 `% c' A! s9 b第6個參數是錯誤資訊,跟前面一樣,這裡不多說了。
. `( W+ i0 l3 |/ V
! ^6 l7 {& N- A2 O* w* Q" Z \5 G下面給個簡單例子:
複製內容到剪貼簿
代碼:
int main( int , char ** )
{
sqlite3 * db;
int result;
char * errmsg = NULL;
char **dbResult; //是 char ** 類型,兩個*號
int nRow, nColumn;
int i , j;
int index;
result = sqlite3_open( “c:\\Dcg_database.db”, &db );
if( result != SQLITE_OK )
{
//資料庫開啟失敗
return -1;
}
//資料庫作業碼
//假設前面已經建立了 MyTable_1 表
//開始查詢,傳入的 dbResult 已經是 char **,這裡又加了一個 & 取地址符,傳遞進去的就成了 char ***
result = sqlite3_get_table( db, “select * from MyTable_1”, &dbResult, &nRow, &nColumn, &errmsg );
if( SQLITE_OK == result )
{
//查詢成功
index = nColumn; //前面說過 dbResult 前面第一行資料是欄位名稱,從 nColumn 索引開始才是真正的資料
printf( “查到%d條記錄\n”, nRow );
for( i = 0; i < nRow ; i++ )
{
printf( “第 %d 條記錄\n”, i+1 );
for( j = 0 ; j < nColumn; j++ )
{
printf( “欄位名:%s ß> 欄位值:%s\n”, dbResult[j], dbResult [index] );
++index; // dbResult 的欄位值是連續的,從第0索引到第 nColumn - 1索引都是欄位名稱,從第 nColumn 索引開始,後面都是欄位值,它把一個二維的表(傳統的行列標記法)用一個扁平的形式來表示
}
printf( “-------\n” );
}
}
//到這裡,不論資料庫查詢是否成功,都釋放 char** 查詢結果,使用 sqlite 提供的功能來釋放
sqlite3_free_table( dbResult );
//關閉資料庫
sqlite3_close( db );
return 0;
}
到這個例子為止,sqlite3 的常用用法都介紹完了。
/ I9 j" l; m; |8 m, D/ U5 x/ Z7 b/ S6 r8 K
用以上的方法,再配上 sql 語句,完全可以應付絕大多數資料庫需求。0 f" l- j- G z$ e
( x+ I. ^0 S! V9 d; V' R' S! {
但有一種情況,用上面方法是無法實現的:需要insert、select 二進位。當需要處理位元據時,上面的方法就沒辦法做到。下面這一節說明如何插入位元據