SQLite3 數據庫使用

一、SQLite簡介

SQLite 是用C語言編寫的開源數據庫,主要用於嵌入式,你也可以把它集成在自己的桌面程序中,也有人將其替代Access,用作後臺數據庫。

SQLite 支持多數SQL92標準,例如:索引、限制、觸發和查看支持。

支持 NULL、INTEGER、REAL、TEXT 和 BLOB 數據類型,支持事務。

二、下載SQLite

SQLite可以到官方站點下載

http://www.sqlite.org/download.html

包括:Linux,Mac OS X, Windows下的已編譯文件以及源代碼、幫助文檔。

SQLite瀏覽工具下載:http://sqliteadmin.orbmu2k.de/

三、SQLite使用

1、 數據庫連接、SQL解析接口:

    sqlite3_open(); //以UTF-8方式打開


    sqlite3_prepare()
    sqlite3_step()


    sqlite3_column()


    sqlite3_finalize()


    sqlite3_close()

2、sqlite3_column()

    sqlite3_column_blob()
    sqlite3_column_bytes()
    sqlite3_column_bytes16()
    sqlite3_column_count()
    sqlite3_column_double()
    sqlite3_column_int()
    sqlite3_column_int64()
    sqlite3_column_text()
    sqlite3_column_text16()
    sqlite3_column_type()
    sqlite3_column_value()

3、SQL

    sqlite> create table 數據庫 (名字, 嵌入式);
    sqlite> insert into 數據庫 values ('SQLite','是');
    ssqlite> select * from 數據庫;
    sqlite> update 數據庫 set 名字='SQLite3' where 名字='SQLite';
    sqlite> delete from 數據庫 where 嵌入式='是';
    sqlite> .separator "-"

4、事務

    result = sqlite3_exec(db, "BEGIN;", 0, 0, 0);

    //批量處理
    for (int i=0; i<10000; i++)
    {
        //插入一條數據
        result = sqlite3_exec(db,
            "INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('SQLITE3!',         '2013-07-28', '23:00:00', 1000);",0, 0, 0);
    }

    result = sqlite3_exec(db, "COMMIT;", 0, 0, 0);

5、觸發器

    假設"customers"表存儲了客戶信息,"orders"表存儲了訂單信息,下面的觸發器 確保當用戶    改變地址時所有的 關聯訂單地址均進行相應改變:

    CREATE TRIGGER update_customer_address UPDATE OF address ON customers
      BEGIN
        UPDATE orders SET address = new.address WHERE customer_name = old.name;
      END;

    定義了該觸發器後執行如下語句:

    UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones';

    會使下面的語句自動執行:

    UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones';

    注意,目前在有INTEGER PRIMARY KEY域的表上觸發器可能工作不正常。若 BEFORE觸發器修改    了一行的 INTEGER PRIMARY KEY域,而該域將由觸發該觸發器 的語句進行修改,則可能根本不    會修改該域。 可以用PRIMARY KEY字段代替 INTEGER PRIMARY KEY字段來解決上述問題。

6、SQL執行 回調 與 不回調

回調方案
int sqlite3_exec ( sqlite3 *db,  // 使用 sqlite3_open () 打開的數據庫對象。
               const char *sql, // 一條待查詢的 SQL 語句
               sqlite3_callback, // 自定義的回調函數,對查詢結果每一行都執行一次這個函數
               void *,
               char **errmsg
);

這是最常用的執行 sql 語句的調用。簡單的參數含意標在上面函數中,下面對重
要參數含意詳細註釋:

 - 第 4 個參數 "void *" 是調用者所提供的指針,可以傳遞任何一個指針參數到
   這裏,這個參數最終會傳到回調函數裏面,這個指針比較重要,可以用來作參
   數的傳遞。如果不需要傳遞指針給回調函數,可以填NULL。等下我們再看回調
   函數的寫法,以及這個參數的使用。

 - 第 5 個參數 "char ** errmsg" 是錯誤信息。注意是指針的指針。sqlite3裏
   面有很多固定的錯誤信息。執行 sqlite3_exec 之後,執行失敗時可以查閱這
   個指針(直接 printf(“%s\n”,errmsg))得到一串字符串信息,這串信息告訴
   你錯在什麼地方。sqlite3_exec函數通過修改你傳入的指針的指針,把你提供
   的指針指向錯誤提示信息,這樣sqlite3_exec函數外面就可以通過這個
   char*得到具體錯誤提示。

說明:通常, sqlite3_callback 和它後面的 void * 這兩個位置都可以填
NULL。填NULL表示你不需要回調。比如你做 insert 操作,做 delete 操作,就
沒有必要使用回調。而當你做 select 時,就要使用回調,因爲 sqlite3 把數據
查出來,得通過回調告訴你查出了什麼數據。

** exec 的回調函數

typedef int(*sqlite3_callback) (void *, // 這就是上面函數傳遞的 void * 參數,需要強制類型轉換後才能使用。
                    int, // 查詢結果的列數,即有多少個字段數
                    char **, // 保存查詢結果
                    char **  // 各個字段的名字
);

不回調方案
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:\\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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章