VC++调用SQLite数据库开发入门
针对需要在桌面应用程序或嵌入式环境中存储结构化数据的开发者,介绍利用VC++环境调用SQLite开源数据库的核心方法与完整实现流程。
开发前准备
在Visual Studio中集成SQLite通常有两种方式:一是下载预编译的二进制库和头文件手动配置;二是直接添加源码进行编译。为简化集成过程,建议在项目中包含sqlite3.c源文件及sqlite3.h头文件,这种方式能有效避免动态链接库加载时的路径依赖问题。
C++代码操作全流程
第1步:初始化环境与连接数据库
首先需要定义一个指向 sqlite3 结构体的指针作为数据库句柄,并声明错误消息缓冲区。通过调用 sqlite3_open 建立与指定文件的连接。如果该文件不存在,SQLite会自动创建一个新数据库。
#include <stdio.h>
#include <sqlite3.h>
// 全局或局部变量
sqlite3 *db = NULL;
char *errMsg = NULL;
第2步:构建回调函数(用于读取数据)
SQLite的查询结果默认不返回给应用程序内存,而是通过逐行调用用户定义的回调函数来处理。回调函数的签名必须严格匹配:
void* notused: 传递给回调的用户自定义数据指针。int argc: 结果集当前行的列数。char** argv: 字符串数组,存放该行每列的值(若为空则为NULL)。char** columnNames: 字符串数组,存放查询结果的列名。
第3步:使用 sqlite3_exec 执行SQL指令
sqlite3_exec 是常用的接口,可以执行多条SQL语句或不带结果集的SQL语句。其参数包括数据库句柄、SQL字符串、回调函数指针以及传递给回调的参数。
- 建表/插入数据:通常不需要回调,可将第三个参数设为NULL或0。
- 查询(SELECT):需传入回调函数来打印或处理每一行数据。
第4步:资源释放
操作完成后,必须调用 sqlite3_free 释放错误信息内存,并调用 sqlite3_close 关闭数据库句柄,防止内存泄漏。
完整代码示例
以下示例演示了完整的生命周期:打开数据库 -> 创建表 -> 插入数据 -> 查询并遍历数据 -> 清理退出。
#include "stdio.h"
#include "stdlib.h"
#include "sqlite3.h"
/*
数据读取回调函数
*/
static int callback(void* notused, int argc, char** argv, char** szColName) {
for (int i = 0; i < argc; i++) {
printf("%s = %s\n", szColName[i], (argv[i] == 0) ? "NULL" : argv[i]);
}
return 0; // 继续执行下一行
}
int main() {
const char* sCreateTable =
"CREATE TABLE IF NOT EXISTS users(
userid VARCHAR(20) PRIMARY KEY,
age INTEGER,
birthday DATE
);";
const char* sInsertData =
"INSERT INTO users VALUES('wang', 20, '1989-5-4');";
const char* sSelectAll = "SELECT * FROM users;";
sqlite3* db = 0;
char* errMsg = 0;
int ret;
/* 1. 打开数据库 */
ret = sqlite3_open("./test.db", &db);
if (ret != SQLITE_OK) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return -1;
}
printf("数据库连接成功!\n";
/* 2. 执行建表语句 */
ret = sqlite3_exec(db, sCreateTable, 0, 0, &errMsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "创建表失败: %s\n", errMsg);
sqlite3_free(errMsg);
} else {
printf("表结构创建成功\n";
}
/* 3. 执行插入语句 */
ret = sqlite3_exec(db, sInsertData, 0, 0, &errMsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "插入失败: %s\n", errMsg);
sqlite3_free(errMsg);
} else {
printf("数据插入成功\n";
}
/* 4. 执行查询并触发回调 */
printf("查询所有记录:\n";
ret = sqlite3_exec(db, sSelectAll, callback, 0, &errMsg);
if (ret != SQLITE_OK) {
fprintf(stderr, "查询失败: %s\n", errMsg);
sqlite3_free(errMsg);
}
/* 5. 关闭数据库 */
sqlite3_close(db);
return 0;
}
以上就是VC++操作SQLite简单实例的详细内容,更多关于VC++操作SQLite的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









