在一個嵌入式 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
sqlite3_stmt 結構體(位元組碼),此時尚未執行。? 為佔位符,索引從 1 開始;綁定資料型別需與欄位對應。SQLITE_ROW:查詢有結果列,需呼叫 sqlite3_column_XXX() 取值(欄位索引 從 0 開始)。SQLITE_DONE:執行完成無結果列(INSERT/UPDATE/DELETE 或查詢結束)。sqlite3_prepare() 分配的記憶體,必須成對呼叫防止洩漏。實務上可將上述流程封裝為 RAII 風格的 C++ Wrapper 類別,自動管理 statement 生命週期、錯誤轉換為例外、支援交易批次提交等。若需高階功能(WAL 模式、全文搜尋 FTS5、JSON1 擴充),請深入閱讀官方文件與原始碼註解。