標籤:
本系列文章主要是使用C++語言來調用其API,達到管中窺豹的目的。另外本文使用的開發環境為mac + clion,並且基於SQLite 3.7.14來進行開發.
一、去下載sqlite-amalgamation-3071400.zip,然後解壓到檔案夾(其結構分類樹如下):
.
├── shell.c
├── sqlite3.c
├── sqlite3.h
└── sqlite3ext.h
二、建立一個sql_tutorial的工程,景sqlite3.c和sqlite3.h檔案拷貝到sql_src目錄下:
.
├── main.cpp
└── sql_src
├── sqlite3.c
└── sqlite3.h
三、在main.cpp中調用sqlite的代碼如下:
/** * We get the version of the SQLite database. This time we will use an SQL query. */#include <iostream>#include "./sql_src/sqlite3.h"using namespace std;int main() { sqlite3 *db; sqlite3_stmt *res; const char *file = "test.db"; int rc = sqlite3_open(file, &db); if (rc != SQLITE_OK) { cout << "Cannot open database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); } rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0); if (rc != SQLITE_OK) { cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); } rc = sqlite3_step(res); if (rc == SQLITE_ROW) { cout << sqlite3_column_text(res, 0) << endl; } sqlite3_finalize(res); sqlite3_close(db); return 0;}
四、最後的運行結果如下:
3.7.14Process finished with exit code 0
調用分析:
sqlite3 *db;
1、該sqlite3的結構定義了一個資料庫控制代碼。每個開啟的SQLite資料庫是由資料庫控制代碼表示。
sqlite3_stmt *res;
2、該sqlite3_stmt結構代表一個SQL語句。
int rc = sqlite3_open(file, &db);
3、該sqlite3_open()函數開啟一個新的資料庫連接。其參數是資料庫名稱和資料庫控制代碼。在“test.db的”是採用了特殊的資料庫名稱導致開啟一個記憶體資料庫。函數的返回碼指示資料庫是否被成功開啟。當串連成功建立,則返回SQLITE_OK。
if (rc != SQLITE_OK) { cout << "Cannot open database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); }
4、如果傳回碼指示錯誤,我們列印郵件到控制台,關閉資料庫處理,並終止該計劃。該sqlite3_errmsg()函數返回錯誤的描述。它是否被開啟時發生錯誤,與資料庫連接控制代碼相關聯的資源,應通過使其向sqlite3_close()函數釋放。
rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0); if (rc != SQLITE_OK) { cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); }
5、執行SQL語句之前,必須調用首先被編譯成位元組代碼的sqlite3_prepare功能之一。 (該sqlite3_prepare()函數被棄用。)
sqlite3_prepare_v2()函數有五個參數。
第一個參數是從所述sqlite3_open()函數獲得的資料庫控制代碼。
第二個參數是要編譯的SQL語句。
第三個參數為以位元組為單位的SQL語句的最大長度。傳遞-1會導致讀取SQL字串到第一個零終止子字串結束了。根據該檔案,可以通過傳遞提供的SQL字串的位元組的確切數量獲得一些小的效能優勢。
第四個參數是語句控制代碼。這將指向先行編譯的語句,如果sqlite3_prepare_v2()成功運行
最後一個參數是一個指向SQL語句的未使用的部分。只有SQL字串的第一個語句被編譯,所以參數指向剩下什麼未編譯。我們傳入0,因為該參數對我們不是很重要。
如果成功,sqlite3_prepare_v2()返回SQLITE_OK;否則錯誤碼返回
rc = sqlite3_step(res);
6、調用sqlite3_step()運行SQL語句。 SQLITE_ROW返回碼錶示有另一行準備。我們的SQL語句返回只有一行資料,因此,我們調用這個函數一次。
sqlite3_finalize(res);
7、該sqlite3_finalize()函數銷毀準備語句對象。
sqlite3_close(db);
8、該sqlite3_close()函數關閉資料庫連接。
[原]SQLite的學習系列之擷取資料庫版本二