切换主题
C语言轻量级的关系型数据库sqlite库的使用
SQLite 是一个轻量级、服务器无关的关系型数据库库,广泛应用于嵌入式系统、移动设备、桌面应用程序等场景。它的特点是简单易用、体积小、支持 SQL 标准,且不需要安装和配置数据库服务。下面是如何在 C 语言中使用 SQLite 库的基本教程。
1. 安装 SQLite
在大多数 Linux 发行版中,你可以通过包管理器安装 SQLite:
bash
sudo apt-get install sqlite3 libsqlite3-dev
1
在 macOS 上,你可以使用 Homebrew 安装:
bash
brew install sqlite
1
如果你使用 Windows,SQLite 的官方页面提供了预编译的二进制文件:SQLite Download Page。
2. 链接 SQLite 库
在 C 程序中使用 SQLite 时,需要将 sqlite3
库链接到项目中。通常,编译时添加 -lsqlite3
参数:
bash
gcc -o my_program my_program.c -lsqlite3
1
3. C 语言中的 SQLite 基本操作
SQLite 的 C API 提供了许多函数来执行数据库操作。下面是一些基本操作的示例,包括创建数据库、打开数据库、执行 SQL 查询等。
a. 打开数据库
首先需要打开(或创建)一个数据库文件。如果文件不存在,SQLite 会自动创建一个新的数据库文件。
c
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *err_msg = 0;
// 打开(或创建)一个数据库文件
int rc = sqlite3_open("test.db", &db); // 传入数据库文件名
if (rc != SQLITE_OK) {
printf("无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
printf("数据库打开成功\n");
// 关闭数据库
sqlite3_close(db);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
b. 执行 SQL 语句(创建表格)
在 SQLite 中执行 SQL 语句可以使用 sqlite3_exec
函数。以下是一个创建表格的示例:
c
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
printf("无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
// 创建表
const char *sql = "CREATE TABLE IF NOT EXISTS Person(Id INTEGER PRIMARY KEY, Name TEXT, Age INTEGER);";
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK) {
printf("SQL 错误: %s\n", err_msg);
sqlite3_free(err_msg);
} else {
printf("表创建成功\n");
}
sqlite3_close(db);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
c. 插入数据
使用 sqlite3_exec
执行 SQL 插入语句:
c
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
printf("无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
const char *sql = "INSERT INTO Person(Name, Age) VALUES('Alice', 30);";
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK) {
printf("SQL 错误: %s\n", err_msg);
sqlite3_free(err_msg);
} else {
printf("数据插入成功\n");
}
sqlite3_close(db);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
d. 查询数据
查询数据时,我们通常会使用回调函数来处理查询结果。以下是查询所有人的名字和年龄并打印出来的示例:
c
#include <stdio.h>
#include <sqlite3.h>
static int callback(void *data, int argc, char **argv, char **azColName) {
for (int i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
return 0;
}
int main() {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
printf("无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
const char *sql = "SELECT * FROM Person;";
rc = sqlite3_exec(db, sql, callback, 0, &err_msg);
if (rc != SQLITE_OK) {
printf("SQL 错误: %s\n", err_msg);
sqlite3_free(err_msg);
} else {
printf("查询完成\n");
}
sqlite3_close(db);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
在回调函数中,我们打印了每一列的名字和值。callback
函数将每一行的数据传递给你,然后你可以处理这些数据。
e. 更新数据
更新数据也可以通过 sqlite3_exec
来实现,下面是一个示例,更新 Person
表中年龄为 30 的记录:
c
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
printf("无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
const char *sql = "UPDATE Person SET Age = 35 WHERE Name = 'Alice';";
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK) {
printf("SQL 错误: %s\n", err_msg);
sqlite3_free(err_msg);
} else {
printf("数据更新成功\n");
}
sqlite3_close(db);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
f. 删除数据
删除数据使用类似的 SQL 语句:
c
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
printf("无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
const char *sql = "DELETE FROM Person WHERE Name = 'Alice';";
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK) {
printf("SQL 错误: %s\n", err_msg);
sqlite3_free(err_msg);
} else {
printf("数据删除成功\n");
}
sqlite3_close(db);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
4. 错误处理
每个 SQLite 函数返回一个错误码,你可以使用 sqlite3_errmsg()
获取详细的错误信息。通常情况下,执行 SQL 时需要检查返回值并在发生错误时进行处理。
c
if (rc != SQLITE_OK) {
printf("SQL 错误: %s\n", sqlite3_errmsg(db));
}
1
2
3
2
3
5. 关闭数据库
在使用完数据库后,记得关闭数据库连接:
c
sqlite3_close(db);
1
总结
- SQLite 是一个非常适合嵌入式应用、移动设备以及小型项目的轻量级数据库库,提供了完整的 SQL 支持。
- 基本操作:创建数据库、创建表、插入数据、查询数据、更新数据和删除数据都可以通过简单的 C API 来实现。
- 回调函数:查询操作使用回调函数来处理返回的结果。
- 错误处理:要时刻关注数据库操作的错误,使用
sqlite3_errmsg()
获取详细的错误信息。
SQLite 因其简单、轻量的特性,在很多小型项目中得到了广泛应用。如果你正在做一个需要内嵌数据库的应用,SQLite 是一个不错的选择。