C/C++中Sqlite使用簡介

來源:互聯網
上載者:User

一、簡介

SQLite是一個基於檔案的輕量級資料庫,但功能還挺強,速度也很快,對於小型資料庫應用開發絕對夠用了。使用起來也非常方便,下面的介紹可以看出來,使用起來真的非常簡單。

 

二、官方網站

 

Sqlite的官方網站www.sqlite.org,在該網站可以下載最新的sqlite版本。

 

 

三、協助工具輔助工具

     Sqlite資料庫的管理工具有SQLiteManager、SqliteAdmin等。

SqliteManager只有英文版,但功能強大,有個問題就是不支援ANSI字元集的漢字顯示。其內建的協助文檔有SQL語句的詳細介紹,對於不熟悉Sql語句的人來說很方便。而且它的很多操作都有自動的SQL語句提示,對於不常使用資料庫的人來說也很好用。

SqliteAdmin有綠色中文版,功能相對於SqliteManager略少,對於熟悉Sql語句的人,該版本夠用了。

 

四、C/C++使用前準備

直接將sqlite3.h和sqlite3.c加入自己的C/C++工程中,即可使用sqlite3。

 

五、開啟關閉資料庫

Sqlite支援UTF-8和UTF-16,不過它居然不支援C/C++程式中最常用的ANSI。因此資料庫路徑中如果包含中文字元的話,需要將路徑轉換成相應的字元格式設定。

1、以UTF-8方式開啟

//開啟資料庫

sqlite3 *db = NULL;

int result = sqlite3_open("c:\\abc.db", &db);

if (SQLITE_OK != result)

{

    return;

}

 

//關閉資料庫

sqlite3_close(db);

 

2、以UTF-16方式開啟

如要以UTF-16方式開啟,把開啟資料庫的語句改為"sqlite3_open16(L"c:\\abc.db", &db)"即可。

但一般情況,強烈不建議使用UTF-16方式開啟資料庫,根據我的測試,我發現如果以這種方式開啟資料庫,在後續建立資料表的時候,如果其中有某項為TEXT類型。那麼資料表的這項資料內容,將會強制確定類型為UTF-16。也就是說,你插入的任何資料,都將被轉換為UTF-16並存入資料庫。而執行SQL的語句是UTF-8格式的,因此當你取出的資料和你存入的資料是不一致的,很顯然這對於使用者而言是一個災難。

 

六、執行SQL語句

執行SQL語句可以調用sqlite3_exec函數,一般來說,如果不需要返回的資料和錯誤資訊,執行方式如下:

 

sqlite3_exec(db, strSQL, 0, 0, 0);

1、建立表

假設建立如所示的資料庫:

其SQL語句為:

CREATE TABLE [MyTable] ([ID] INTEGER PRIMARY KEY NOT NULL,[MyText] TEXT NULL, [MyDate] DATE NOT NULL, [MyTime] TIME NULL,[MyFloat] FLOAT NULL)

 

2、插入記錄

下面是插入一條記錄的樣本SQL語句。

INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好遠!', '2012-03-23', '9:00:00', 1000)

 

3、更新記錄

下面是更新若干條記錄的樣本SQL語句。

UPDATE MyTable SET MyText='真的嗎?', MyTime='10:00:00' WHERE ID >=0 AND ID <=20

 

4、刪除記錄

下面是刪除若干條記錄的樣本SQL語句。

DELETE FROM MyTable WHERE ID >=3 AND ID <=5

 

5、大量操作

如果要進行大量的操作,比如要插入10000條資料,如果逐條執行SQL語句,則消耗的時間非常長。採用事務的方式批量處理,可以極大程度提升操作速度(我用1000條記錄實驗了一下,速度提高了500倍以上)。

下面是一個批量插入10000條資料的程式碼範例:

//插入條資料(在Begin和Commit之間大量操作,可以大幅度提高效率)

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 ('---上班好遠!', '2012-03-23', '9:00:00', 1000);",

        0, 0, 0);

}

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

 

 七、查詢並返回結果  1、以表單形式返回

下面是以表單形式擷取資料的範例程式碼:

//查詢記錄(返回資料表的方式)

char **pazResult;

int nRow, nCol;

sqlite3_get_table(db, "SELECT * FROM MyTable LIMIT 1000 OFFSET 2000", &pazResult, &nRow, &nCol, 0);

 

//nRow指示出有多少行

//nCol指示出有多少列

//從pazResult中可以解析出所有記錄,記錄以字串形式返回

//第n列的名稱,存放於pazResult[n]

//第n行第m列的資料,存放與paszResult[(m + 1) * nCol + m]

 

//使用完後,務必釋放為記錄分配的記憶體

sqlite3_free_table(pazResult);

上面的查詢代碼,也示範了如何查詢指定位置指定條數的記錄,這種查詢方法在記錄集非常龐大的時候很有用。

 

2、以回調形式返回

下面以代碼形式樣本如何獲得查詢語句返回的記錄。

首先需要定義一個回呼函數如下(參數意義待會再說):

int Result(void* pContext, int nCol, char** azValue, char** azName);

然後調用sqlite函數執行查詢語句,在回呼函數一欄輸入上面定義的回呼函數:

sqlite3_exec(db, "SELECT * FROM MyTable LIMIT 10 OFFSET 20", Result, 0, 0);

執行該SQL語句時,每返回一條記錄都會觸發一次上面的回呼函數,在該回呼函數的實現中,即可得到查詢結果。

在上面的Result函數中,各個參數意義如下:

pContext

這個參數是調用sqlite3_exec函數是輸入的第4個參數。它通常作為環境變數用於指示出當前執行代碼的主體。範例程式碼中我忽略了這個參數,但正式使用時一般不會忽略它。

nCol

表示該條記錄有多少列。

azValue

返回的資料都蘊含在該變數中,它也是一個字串數組。azValue[n]即為第n列的資料。

azName

存放列的名稱,azName[n]就是第n列的名稱。

 

 

八、存取位元據

存取位元據需要用到sqlite3_bind_blob等函數,具體用法可以查看這些函數的聲明。作為一個輕量級資料庫,我一般不用它儲存位元據,因此這兒不再詳細描述這些內容。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.