SQLite - 開始學習 C/C++

你好,有抱負的程式設計師們!今天,我們將踏上一段令人興奮的旅程,進入使用 C/C++ 的 SQLite 世界。別擔心如果你之前從未寫過一行代碼 - 我們會從最基本的開始,逐步學習。到了這個教學的結尾,你會對你所達成的成就感到驚奇!

SQLite - C/C++

SQLite 是什麼?

在我們深入代碼之前,讓我們先了解 SQLite 是什麼。想像你有一個數位筆記本,你可以在裡面有組織地存儲各種信息。這就是 SQLite 的本質 - 一個輕量級、基於文件的數據庫,不需要獨立的伺服器進程。它就像是你口袋裡的一個迷你數據庫!

C/C++ 接口 API

要使用 C/C++ 與 SQLite 互動,我們需要使用所謂的 API(應用程序編程接口)。可以把這些想像成特別的工具,讓我們的 C/C++ 程式能夠與 SQLite 進行通信。以下是我們將要使用的主要 API:

API 函數 描述
sqlite3_open() 打開與 SQLite 數據庫的連接
sqlite3_exec() 執行 SQL 語句
sqlite3_close() 關閉數據庫連接
sqlite3_errmsg() 返回錯誤信息

別擔心這些現在看起來讓人害怕。我們將帶著大量的範例一一探討!

連接到數據庫

讓我們從連接到數據庫開始。這就像打開我們的數位筆記本來開始寫作。

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

int main() {
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);

if (rc) {
fprintf(stderr, "無法打開數據庫: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "成功打開數據庫\n");
}

sqlite3_close(db);
return 0;
}

讓我們分解一下:

  1. 我們包含了必要的頭文件:stdio.h 用於輸入/輸出,sqlite3.h 用於 SQLite 函數。
  2. main() 中,我們聲明了一個指向 sqlite3 的指針,這代表我們的數據庫連接。
  3. 我們使用 sqlite3_open() 來打開(或創建)名為 "test.db" 的數據庫。
  4. 我們檢查連接是否成功。如果不成功,我們打印一條錯誤信息。
  5. 最後,我們使用 sqlite3_close() 關閉數據庫連接。

創建一個表

現在我們的筆記本已經打開,讓我們創建一頁來存儲一些信息。在數據庫術語中,我們稱之為表。

int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;

rc = sqlite3_open("test.db", &db);

if (rc) {
fprintf(stderr, "無法打開數據庫: %s\n", sqlite3_errmsg(db));
return(0);
}

char *sql = "CREATE TABLE STUDENTS("
"ID INT PRIMARY KEY     NOT NULL,"
"NAME           TEXT    NOT NULL,"
"AGE            INT     NOT NULL,"
"GRADE          CHAR(1) );";

rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 錯誤: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "表創建成功\n");
}

sqlite3_close(db);
return 0;
}

在這個範例中:

  1. 我們像以前一樣打開數據庫。
  2. 我們定義了一個 SQL 語句來創建一個名為 STUDENTS 的表,其中有 ID、NAME、AGE 和 GRADE 列。
  3. 我們使用 sqlite3_exec() 來執行這個 SQL 語句。
  4. 我們檢查執行是否成功,並打印一條相應的信息。

INSERT 操作

太好了!我們有了表。現在讓我們向其中添加一些數據。

char *sql = "INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (1, 'Alice', 20, 'A' ); "
"INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (2, 'Bob', 21, 'B' ); ";

rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 錯誤: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "記錄插入成功\n");
}

在這裡,我們正在將兩條記錄插入到我們的 STUDENTS 表中。SQL 語句使用 INSERT INTO 語法來添加新的行。

SELECT 操作

現在,讓我們檢索我們剛才插入的數據。這是數據庫真正發揮魔力的地方!

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
for(int i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}

// 在 main() 中
char *sql = "SELECT * from STUDENTS";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 錯誤: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "操作成功完成\n");
}

這個範例引入了一個回調函數。當我們選擇數據時,SQLite 對結果集中的每一行調用這個函數。這就像有一個助手在我們的筆記本中讀出每一條記錄!

UPDATE 操作

如果我們犯了錯誤並需要更改一些數據,那麼該怎麼辦呢?這就是 UPDATE 的用處。

char *sql = "UPDATE STUDENTS set GRADE = 'A' where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 錯誤: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "記錄更新成功\n");
}

這個 SQL 語句將 Bob 的成績改為 A。Bob,你做得很好!

DELETE 操作

有時候,我們需要刪除數據。讓我們看看如何刪除一條記錄。

char *sql = "DELETE from STUDENTS where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 錯誤: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "記錄刪除成功\n");
}

這將從我們的表中刪除 Bob 的記錄。對不起,Bob!

至此,我們已經涵蓋了在 C/C++ 中使用 SQLite 的基礎。記住,編程就像學習一門新語言 - 它需要練習。如果事情立即不能理解,不要氣餒。繼續實驗,很快你就能像專家一樣編寫數據庫應用程序了!

Credits: Image by storyset