首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

嵌入式 Linux 專案實戰:選用 SQLite 輕量級資料庫的完整範例

     編輯:關於SqlServer

專案背景與技術選型

在一個嵌入式 Linux 專案中,系統需持久化大量資料並保留 30 天歷史記錄。初期嘗試使用平檔儲存,啟動時重新解析,但資料量增長後效能急劇下降。經評估 Berkeley DB 需商業授權,綜合考量效能、體積與授權成本,最終選擇完全開源、零配置、單一檔案的 SQLite。團隊評價:「SQLite 是優秀的完全免費開源資料庫專案。」

核心操作流程範例

以下展示標準的「準備 → 綁定 → 逐步執行 → 釋放」完整週期:

#include <stdio.h>
#include <sqlite3.h>

int main(int argc, char **argv) {
    sqlite3 *db;
    sqlite3_stmt *stmt;
    const char *zTail;

    // 1. 開啟資料庫
    int rc = sqlite3_open("MySQLite.db", &db);
    if (rc) {
        printf("Open failed: %s\n", sqlite3_errmsg(db));
        return 1;
    }

    // 2. 建立資料表
    sqlite3_prepare(db,
        "CREATE TABLE players (ID INTEGER PRIMARY KEY, name TEXT, age INTEGER);",
        -1, &stmt, &zTail);
    sqlite3_step(stmt);
    sqlite3_finalize(stmt);

    // 3. 插入資料(使用參數綁定防止注入)
    sqlite3_prepare(db,
        "INSERT INTO players (name, age) VALUES(?, ?);",
        -1, &stmt, &zTail);

    char str[] = "Kevin";
    int n = 23;
    sqlite3_bind_text(stmt, 1, str, -1, SQLITE_STATIC);
    sqlite3_bind_int(stmt, 2, n);
    rc = sqlite3_step(stmt);
    if (rc != SQLITE_DONE) printf("Insert 1 failed: %s\n", sqlite3_errmsg(db));
    sqlite3_reset(stmt);  // 重置語句以便重用

    char str2[] = "Jack";
    int n2 = 16;
    sqlite3_bind_text(stmt, 1, str2, -1, SQLITE_STATIC);
    sqlite3_bind_int(stmt, 2, n2);
    rc = sqlite3_step(stmt);
    if (rc != SQLITE_DONE) printf("Insert 2 failed: %s\n", sqlite3_errmsg(db));
    sqlite3_finalize(stmt);

    // 4. 查詢所有資料
    sqlite3_prepare(db,
        "SELECT ID, name, age FROM players ORDER BY age;",
        -1, &stmt, &zTail);
    rc = sqlite3_step(stmt);
    while (rc == SQLITE_ROW) {
        int id = sqlite3_column_int(stmt, 0);
        const unsigned char *name = sqlite3_column_text(stmt, 1);
        int age = sqlite3_column_int(stmt, 2);
        printf("ID: %d  Name: %s  Age: %d\n", id, name, age);
        rc = sqlite3_step(stmt);
    }
    sqlite3_finalize(stmt);

    // 5. 關閉資料庫
    sqlite3_close(db);
    return 0;
}

編譯執行:gcc -o sample sample.c -lsqlite3 && ./sample
輸出結果:
ID: 1 Name: Kevin Age: 23
ID: 2 Name: Jack Age: 16

關鍵 API 呼叫時序解析

  • sqlite3_prepare():將 SQL 文本編譯為內部 sqlite3_stmt 結構體(位元組碼),此時尚未執行。
  • sqlite3_bind_XXX():SQL 中以 ? 為佔位符,索引從 1 開始;綁定資料型別需與欄位對應。
  • sqlite3_step():真正執行引擎。回傳值關鍵判斷:
    • SQLITE_ROW:查詢有結果列,需呼叫 sqlite3_column_XXX() 取值(欄位索引 從 0 開始)。
    • SQLITE_DONE:執行完成無結果列(INSERT/UPDATE/DELETE 或查詢結束)。
  • sqlite3_reset():清除已綁定參數,保留編譯後的位元組碼,適合重複執行同一 SQL。
  • sqlite3_finalize():釋放 sqlite3_prepare() 分配的記憶體,必須成對呼叫防止洩漏。

進階建議

實務上可將上述流程封裝為 RAII 風格的 C++ Wrapper 類別,自動管理 statement 生命週期、錯誤轉換為例外、支援交易批次提交等。若需高階功能(WAL 模式、全文搜尋 FTS5、JSON1 擴充),請深入閱讀官方文件與原始碼註解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved