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 TRANSACTIONCOMMIT/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数据库的基本操作。