概述

本文简单描述如何在mfc项目中使用sqlite3,以便备忘

下载

https://sqlite.org/download.html

image.png

创建项目

为了演示方便,这里创建了一个控制台应用程序

image.png

image.png

然后创建一个dll项目,用于sqlite3的封装

为了方便导出,这里选择mfc扩展dll,这样无需手动编写exp

image.png

将刚刚下载的sqlite中的两个文件拷贝到项目目录,并且添加进去

image.png

项目如图
image.png

改一下dll项目属性,不使用预编译头

image.png

整理项目,将不相关的所有文件删除

image.png

只需要上面这么3个文件。

增加项目预处理器

SQL_DLL

image.png

封装

由于sqlite3是c编写的,无法在dll中自动导出,所以我们封装成c++的类,之后自动导出。

新建Db.h

#pragma once



#ifdef SQL_DLL
#define SQL_DLL_API __declspec(dllexport)
#else
#define SQL_DLL_API __declspec(dllimport)
#endif



#include "sqlite3.h"

class SQL_DLL_API Db
{
public:
    Db();
    void open(const char* db);
    void close();
    const char* errmsg();
    void exec(const char* sql);

    sqlite3* sqlite3;

};



新建Db.cpp


#include "Db.h"


Db::Db() {
    sqlite3 = NULL;
}

void Db::open(const char* db)
{
    if (SQLITE_OK != sqlite3_open(db, &sqlite3)) {
        throw errmsg();
    }
}
const char* Db::errmsg() {
    return sqlite3_errmsg(sqlite3);
}

void  Db::exec(const char* sql) {
    if (SQLITE_OK != sqlite3_exec(sqlite3, sql, NULL, NULL, NULL)) {
        throw errmsg();
    }
}

void Db::close()
{
    if (SQLITE_OK != sqlite3_close(sqlite3)) {
        throw errmsg();
    }
}

这里先做一个初步封装

编写测试程序

设置主项目依赖

增加包含目录(include)

image.png

增加库目录(library)

image.png

增加主项目的依赖项目

image.png

在主项目中编写调用代码

int main()
{
    //std::cout << "Hello World!\n";
    Db db;
    try {
        db.open("d:\\1.db");
        db.exec("create table if not exists student(id integer primary key, name text, age integer)");
        char sql[1000];
        sprintf_s(sql, 1000, "insert into student(id,name,age)values(%d,'%s',%d)", 1, "zhangsan", 10);

        db.exec(sql);

        db.close();
    }
    catch (const char* text) {
        printf(text);
        db.close();
    }
 

}

这样,如果需要使用更多函数,则继续在封装类编写即可。


jzoom
1.2k 声望335 粉丝

A simple way to solving problems is using tools like docker/Spring boot/React Native/React/Vue… Technology should not become a bottleneck in thinking.