【資料庫】SQLITE3 使用總結3

來源:互聯網
上載者:User
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 二進位。當需要處理位元據時,上面的方法就沒辦法做到。下面這一節說明如何插入位元據

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.