SQLite - C/C++ for 初学者

你好,有抱负的程序开发者们!今天,我们将开始一段激动人心的旅程,使用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. 我们检查执行是否成功并打印相应的信息。

插入操作

太棒了!我们有了表。现在让我们向其中添加一些数据。

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 语法来添加新行。

查询操作

现在,让我们检索我们刚刚插入的数据。这就是数据库的真正魅力所在!

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");
}

这个例子引入了一个回调函数。当我们进行 SELECT 查询时,SQLite 会为结果中的每一行调用这个函数。就像有一个助手在朗读我们记事本中的每一项!

更新操作

如果我们犯了一个错误并需要更改一些数据,那该怎么办呢?这就是 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做得好!

删除操作

有时,我们需要删除数据。让我们看看如何删除一条记录。

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