[原]SQLite的學習系列之獲取數據庫版本二

本系列文章主要是使用C++語言來調用其API,達到管中窺豹的目的。另外本文使用的開發環境爲mac + clion,而且基於SQLite 3.7.14來進行開發.ios

  1、去下載sqlite-amalgamation-3071400.zip,而後解壓到文件夾(其結構目錄樹以下):sql

    .shell

    ├── shell.c數據庫

    ├── sqlite3.c函數

    ├── sqlite3.h性能

    └── sqlite3ext.hfetch

 

  2、新建一個sql_tutorial的工程,景sqlite3.c和sqlite3.h文件拷貝到sql_src目錄下:spa

    .code

    ├── main.cppsqlite

    └── sql_src

        ├── sqlite3.c

        └── sqlite3.h

 

  

  3、在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;
}

  4、最後的運行結果以下:

  

3.7.14

Process finished with exit code 0

  

  調用分析:

sqlite3 *db;

  一、該sqlite3的結構定義了一個數據庫句柄。每一個打開的SQLite數據庫是由數據庫句柄表示。

 

sqlite3_stmt *res;

  二、該sqlite3_stmt結構表明一個SQL語句。

 

int rc = sqlite3_open(file, &db);

  三、該sqlite3_open()函數打開一個新的數據庫鏈接。其參數是數據庫名稱和數據庫句柄。在「test.db的」是採用了特殊的數據庫名稱致使打開一個內存數據庫。函數的返回碼指示數據庫是否被成功打開。當鏈接成功創建,則返回SQLITE_OK。

 

if (rc != SQLITE_OK) {
        cout << "Cannot open database: " << sqlite3_errmsg(db) << endl;
        sqlite3_close(db);

        exit(1);
    }

  四、若是返回代碼指示錯誤,咱們打印郵件到控制檯,關閉數據庫處理,並終止該計劃。該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);
    }

  五、執行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);

  六、調用sqlite3_step()運行SQL語句。 SQLITE_ROW返回碼錶示有另外一行準備。咱們的SQL語句返回只有一行數據,所以,咱們調用這個函數一次。

  

sqlite3_finalize(res);

  七、該sqlite3_finalize()函數銷燬準備語句對象。

 

sqlite3_close(db);

  八、該sqlite3_close()函數關閉數據庫鏈接。

相關文章
相關標籤/搜索