VC++调用SQLite数据库开发入门

江屿
江屿
发布时间:2026-10-14 | 5人浏览过
原创

针对需要在桌面应用程序或嵌入式环境中存储结构化数据的开发者,介绍利用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的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表