[轉]c++ 開發 sqlite

#include <iostream>
#include <sqlite3.h>
using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    sqlite3 *sql = NULL; // 一個打開的數據庫實例
        const char * path = "/home/gaoyuan/temp/test.db";//某個sql文件的路徑

        // 根據文件路徑打開數據庫鏈接。若是數據庫不存在,則建立。
        // 數據庫文件的路徑必須以C字符串傳入。
        int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL);

        if (result == SQLITE_OK) {
            std::clog << "打開數據庫鏈接成功";
        }
        else {
            std::clog << "打開數據庫鏈接失敗";
        }

    return 0;
}

 打開或者建立數據庫ios

 

const char *sqlSentence = "INSERT INTO t_person(name, age) VALUES('夏明', 22); ";        //SQL語句
    sqlite3_stmt *stmt = NULL;        //stmt語句句柄

    //進行插入前的準備工做——檢查語句合法性
    //-1表明系統會自動計算SQL語句的長度
    int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);

    if (result == SQLITE_OK) {
        std::clog<< "添加數據語句OK";
        //執行該語句
        sqlite3_step(stmt);
    }
    else {
        std::clog << "添加數據語句有問題";
    }
    //清理語句句柄,準備執行下一個語句
    sqlite3_finalize(stmt);

執行不返回數據的SQL語句(增、刪、改)。sql

執行更新、刪除語句和執行創表、添加語句基本相似,只需更改sql語句便可。)數據庫

 

 

const char *sqlSentence = "SELECT name, age FROM t_person WHERE age < 30;";    //SQL語句
    sqlite3_stmt *stmt = NULL;    // stmt語句句柄

    //進行查詢前的準備工做——檢查語句合法性
    //-1表明系統會自動計算SQL語句的長度
    int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);

    if (result == SQLITE_OK) {
        std::clog <<  "查詢語句OK";
            // 每調一次sqlite3_step()函數,stmt語句句柄就會指向下一條記錄
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                // 取出第0列字段的值
                const unsigned char *name = sqlite3_column_text(stmt, 0);
                // 取出第1列字段的值
                int age = sqlite3_column_int(stmt, 1);
                //輸出相關查詢的數據
                std::clog << "name = " << name <<", age = "<< age;
            }
    }
    else {
        std::clog << "查詢語句有問題";
    }
    //清理語句句柄,準備執行下一個語句
    sqlite3_finalize(stmt);

執行返回數據的SQL語句(查)。緩存

 

if (sql) {
        sqlite3_close_v2(sql);
        sql = nullptr;
 }

關閉數據庫:sqlite3_close_v2(sqlite3* sql)多線程

 

SQLite3 庫函數 總結

1.打開數據庫函數

int sqlite3_open_v2( const char *filename,   // 數據庫的文件路徑 sqlite3 **ppDb,       // 數據庫實例 int flags,          // 標誌 const char *zVfs      // 使用該數據庫的虛擬機的名字,這裏咱們不須要用,直接NULL );

其中:工具

 flags參數有以下標誌:
SQLITE_OPEN_NOMUTEX: 設置數據庫鏈接運行在多線程模式(沒有指定單線程模式的狀況下)
SQLITE_OPEN_FULLMUTEX:設置數據庫鏈接運行在串行模式。
SQLITE_OPEN_SHAREDCACHE:設置運行在共享緩存模式。
SQLITE_OPEN_PRIVATECACHE:設置運行在非共享緩存模式。
SQLITE_OPEN_READWRITE:指定數據庫鏈接能夠讀寫。
SQLITE_OPEN_CREATE:若是數據庫不存在,則建立。
spa

 

2.檢查SQL語句的合法性(查詢前的準備)線程

若語句合法即編譯經過,則將語句產生的指令塞進stmt句柄(此時並未執行指令)調試

複製代碼
int sqlite3_prepare_v2( sqlite3 *db, // 數據庫實例 const char *zSql, // 須要檢查的SQL語句 int nByte, // SQL語句的最大字節長度 sqlite3_stmt **ppStmt, // stmt句柄,用來存儲SQL stmt指令 const char **pzTail );
複製代碼

 

3.執行stmt句柄(執行存儲在stmt句柄的指令

若是指令能查詢到下一行數據,就會返回SQLITE_ROW

若是指令(例如寫入數據)不須要返還數據,就會返還SQLITE_DONE

int sqlite3_step(   sqlite3_stmt* stmt   //stmt句柄 ); 

4.利用stmt句柄得到第iCol字段的值(字段的下標從0開始)

//執行完查詢句柄後,stmt就會指向查到的數據

//而後能夠經過stmt獲取相應數據

double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點數據 int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數據 sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數據 const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進制文本數據 const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串數據

 

其餘:

清理語句句柄(以便重複使用同一個stmt句柄)

int sqlite3_finalize(   sqlite_stmt* stmt      //stmt句柄 );

關閉數據庫鏈接

int sqlite3_close_v2(   sqlite3 * sql, // 數據庫實例 );

直接編譯並執行 SQL語句

(不推薦使用:一、沒有SQL語法檢查 二、每一句SQL語句即便徹底同樣,也會從新編譯執行,對批量指令來講效率不高。)

複製代碼
int sqlite3_exec( sqlite3* sql, // 一個打開的數據庫實例 const char * sqlSentence, // 須要執行的SQL語句 int (*callback)(void*,int,char**,char**), // SQL語句執行完畢後的回調 void *, // 回調函數的第1個參數 char **errmsg // 錯誤信息 );
複製代碼

 

|額外:使用SQLiteStudio工具來輔佐

SQLiteStudio是一個可視化的數據庫管理工具。

經過可視化界面,它能夠方便快捷地查看或操做數據庫信息。

它是程序sqlite數據調試檢查不可或缺的輔助工具。

(界面大概如圖:)

 

SQLiteStudio 下載地址:https://sqlitestudio.pl/index.rvt?act=download

相關文章
相關標籤/搜索