SQLite - 開始學習 C/C++
你好,有抱負的程式設計師們!今天,我們將踏上一段令人興奮的旅程,進入使用 C/C++ 的 SQLite 世界。別擔心如果你之前從未寫過一行代碼 - 我們會從最基本的開始,逐步學習。到了這個教學的結尾,你會對你所達成的成就感到驚奇!
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;
}
讓我們分解一下:
- 我們包含了必要的頭文件:
stdio.h
用於輸入/輸出,sqlite3.h
用於 SQLite 函數。 - 在
main()
中,我們聲明了一個指向sqlite3
的指針,這代表我們的數據庫連接。 - 我們使用
sqlite3_open()
來打開(或創建)名為 "test.db" 的數據庫。 - 我們檢查連接是否成功。如果不成功,我們打印一條錯誤信息。
- 最後,我們使用
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;
}
在這個範例中:
- 我們像以前一樣打開數據庫。
- 我們定義了一個 SQL 語句來創建一個名為 STUDENTS 的表,其中有 ID、NAME、AGE 和 GRADE 列。
- 我們使用
sqlite3_exec()
來執行這個 SQL 語句。 - 我們檢查執行是否成功,並打印一條相應的信息。
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