SQLite - C/C++学习笔记
简介
SQLite是一种嵌入式的关系型数据库,它被设计为不需要单独的服务器进程就能够应用,直接使用文件进行数据存储。
C/C++是SQLite原生支持的编程语言,因此本文将介绍如何在C/C++中使用SQLite。
安装SQLite
SQLite可以直接从其官方网站(https://www.sqlite.org/index.html)进行下载,也可以通过一些包管理工具进行安装,例如:
- Ubuntu:
sudo apt-get install sqlite3 libsqlite3-dev
- macOS:
brew install sqlite
- Windows:下载对应版本的预编译二进制文件即可
使用SQLite
打开/关闭数据库
在使用SQLite之前,需要首先打开一个数据库。可以使用sqlite3_open()
函数来打开一个新的数据库,例如:
cCopy Code#include <sqlite3.h>
sqlite3 *db;
int rc = sqlite3_open("database.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
// TODO: Database operations
sqlite3_close(db);
上述代码会尝试打开名为database.db
的数据库文件,并将结果保存到db
指针中。如果打开失败,会输出错误信息并退出程序;如果打开成功,则可以在其中执行数据库操作。
在不再需要使用SQLite之后,需要调用sqlite3_close()
函数来关闭之前打开的数据库,并释放相关资源。
执行语句
SQLite中的语句可以使用常规的SQL语法来编写,例如:
cCopy Code#include <sqlite3.h>
sqlite3 *db;
int rc = sqlite3_open("database.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
const char *query = "CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT);";
char *err_msg = NULL;
rc = sqlite3_exec(db, query, NULL, NULL, &err_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "Failed to execute query: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return -1;
}
// TODO: Other statements
sqlite3_close(db);
上述代码中,我们使用sqlite3_exec()
函数来执行一个SQL语句,该语句用于创建一个名为users
的新表。如果执行失败,则会输出错误信息并退出程序;如果执行成功,则可以在其中继续执行其他语句。
处理结果集
有些SQL语句会返回结果集,例如SELECT语句。可以使用sqlite3_prepare_v2()
和sqlite3_step()
函数来查询结果集,例如:
cCopy Code#include <sqlite3.h>
sqlite3 *db;
int rc = sqlite3_open("database.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
const char *query = "SELECT id, name FROM users;";
sqlite3_stmt *stmt;
rc = sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
int id = sqlite3_column_int(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
printf("id=%d, name=%s\n", id, name);
}
if (rc != SQLITE_DONE) {
fprintf(stderr, "Failed to fetch data: %s\n", sqlite3_errmsg(db));
}
sqlite3_finalize(stmt);
sqlite3_close(db);
上述代码中,我们使用sqlite3_prepare_v2()
函数来准备一个查询语句,并将其结果保存在stmt
中,之后使用sqlite3_step()
函数依次获取结果集中的每一条记录。对于每一条记录,我们使用sqlite3_column_*()
函数来获取其中列的值,并进行相应的处理。
使用事务
在SQLite中,可以使用事务来保证一组操作的原子性。可以使用BEGIN TRANSACTION
和COMMIT/ROLLBACK TRANSACTION
语句来开启和提交/回滚一个事务,例如:
cCopy Code#include <sqlite3.h>
sqlite3 *db;
int rc = sqlite3_open("database.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL);
// TODO: Database operations
rc = sqlite3_exec(db, "COMMIT TRANSACTION;", NULL, NULL, NULL);
if (rc != SQLITE_OK) {
sqlite3_exec(db, "ROLLBACK TRANSACTION;", NULL, NULL, NULL);
fprintf(stderr, "Failed to commit transaction: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
sqlite3_close(db);
上述代码使用sqlite3_exec()
函数执行了一个事务,并在其中执行了其他的数据库操作。如果其中任意一条操作失败,则会回滚整个事务;否则,会提交所有操作。
总结
本文介绍了如何在C/C++中使用SQLite。通过打开/关闭数据库、执行语句、处理结果集以及使用事务等操作,可以实现对SQLite数据库的基本操作。