C++与SQLite3联合打造实用的应用程序
SQLite是一个轻量级的嵌入式数据库引擎,在C++ 中使用SQLite需要包含SQLite的头文件并链接相应的库。以下是一个在C++ 中使用SQLite的基本示例:
一. 环境搭建
首先需要下载SQLite库。可以从SQLite官方网站(https://sqlite.org/download.html)下载预编译的二进制文件或者源代码。
在C++ 项目中,需要包含SQLite的头文件路径(如果是源代码安装,头文件通常在 sqlite - source - dir/include 目录下),并且链接SQLite库(如果是预编译二进制文件,在Windows下可能是 sqlite3.dll,在Linux下可能是 libsqlite3.so,在编译时需要指定库文件的路径和名称)。
二. 创建数据库和表
以下是一个简单的C++ 程序,用于创建一个SQLite数据库并在其中创建一个表:
#include <iostream> #include <sqlite3.h> int main() { sqlite3 *db; char *errMsg = 0; int rc = sqlite3_open("test.db", &db); if (rc!= SQLITE_OK) { std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl; sqlite3_close(db); return 1; } const char *sql = "CREATE TABLE IF NOT EXISTS users(" "id INTEGER PRIMARY KEY AUTOINCREMENT," "name TEXT NOT NULL," "age INTEGER);"; rc = sqlite3_exec(db, sql, 0, 0, &errMsg); if (rc!= SQLITE_OK) { std::cerr << "SQL error: " << errMsg << std::endl; sqlite3_free(errMsg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0; }
在这个示例中:
首先使用 sqlite3_open 函数打开(如果不存在则创建)一个名为 test.db 的数据库文件,并获取一个数据库连接对象 db。
然后定义一个SQL语句,用于创建一个名为 users 的表,表中包含 id(自增整数主键)、name(非空文本)和 age(整数)三个字段。
使用 sqlite3_exec 函数执行SQL语句,如果执行过程中出现错误,通过 errMsg 获取错误信息并输出。
最后使用 sqlite3_close 函数关闭数据库连接。
三. 插入数据
以下是一个向 users 表中插入数据的示例:
#include <iostream> #include <sqlite3.h> int main() { sqlite3 *db; char *errMsg = 0; int rc = sqlite3_open("test.db", &db); if (rc!= SQLITE_OK) { std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl; sqlite3_close(db); return 1; } const char *sql = "INSERT INTO users (name, age) VALUES ('John', 25);"; rc = sqlite3_exec(db, sql, 0, 0, &errMsg); if (rc!= SQLITE_OK) { std::cerr << "SQL error: " << errMsg << std::endl; sqlite3_free(errMsg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0; }
这里定义了一个SQL插入语句,将名为 John,年龄为25的用户信息插入到 users 表中。
四. 查询数据
以下是一个查询 users 表中数据的示例:
#include <iostream> #include <sqlite3.h> static int callback(void *data, int argc, char argv, char azColName) { for (int i = 0; i < argc; i++) { std::cout << azColName[i] << " = " << argv[i]? argv[i] : "NULL" << std::endl; } std::cout << std::endl; return 0; } int main() { sqlite3 *db; char *errMsg = 0; int rc = sqlite3_open("test.db", &db); if (rc!= SQLITE_OK) { std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl; sqlite3_close(db); return 1; } const char *sql = "SELECT * FROM users;"; rc = sqlite3_exec(db, sql, callback, 0, &errMsg); if (rc!= SQLITE_OK) { std::cerr << "SQL error: " << errMsg << std::endl; sqlite3_free(errMsg); sqlite3_close(db); return 1; } sqlite3_close(db); return 0; }
在这个示例中:
定义了一个回调函数 callback,当查询到数据时,这个函数会被调用,用于处理每一行查询结果。
使用 sqlite3_exec 函数执行查询语句,将 callback 函数作为参数传递,这样查询到的每一行数据都会调用 callback 函数进行处理。