对SQLite3的C_C++接口进行简单的类封装

最近指导一个项目,看了一下他们写的软件源码,其中有对数据库的使用。由于上一个项目中我们使用了MySQL,可能因为惯性,这个项目中他们仍然使用了MySQL。根据需求,预测项目中产生的数据量非常小,并且使用环境力求简单,所以我建议他们换成SQLite轻型数据库。

我接触使用SQLite3也有几年时间了,Android上使用的java接口、树莓派上使用的python接口等等,但是好像还没有用过C\C++的接口。这个项目还是采用MFC框架编写,因此正好使用一下SQLite3的C\C++接口,写了一个简单的类封装,给他们做个演示。

由于很简单,所以先直接把封装的类贴出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// // SQLite.h file
#pragma once
typedef struct sqlite3 sqlite3;//黑暗魔法
typedef int (*SQL_callback)(void* para, int cols, char** results, char** names);
typedef int(*SQL_open)(const char *dbfile, sqlite3 **ppDb);
typedef int(*SQL_close) (sqlite3*);
typedef int(*SQL_exec) (sqlite3*, const char *sqlstring, SQL_callback select_callback, void *, char **errmsg );

class CSQLite
{
private:
HINSTANCE hDll;
sqlite3 *db;
SQL_open sql_open;
SQL_close sql_close;
SQL_exec sql_exec;

public:
CSQLite();
~CSQLite();
int open(const char* dbfile);
int query(const char * sqlstring, SQL_callback select_callback =NULL ,void* para=NULL);
int close();
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// SQLite.cpp file
#include "stdafx.h"
#include "SQLite.h"

CSQLite::CSQLite()
{
hDll = LoadLibrary(_T("sqlite3.dll"));
if (hDll == NULL)
{
MessageBox(NULL, _T("数据库模块加载失败"), _T("数据库错误"), MB_OK);
exit(-1);
}
sql_open = (SQL_open)GetProcAddress(hDll, "sqlite3_open");
sql_close = (SQL_close)GetProcAddress(hDll, "sqlite3_close");
sql_exec = (SQL_exec)GetProcAddress(hDll, "sqlite3_exec");
}

CSQLite::~CSQLite()
{
}

int CSQLite::open(const char* dbfile)
{
return sql_open(dbfile, &db);
}

int CSQLite::query(const char * sqlstring, SQL_callback select_callback, void* para)
{
return sql_exec(db, sqlstring, select_callback, para, NULL);
}

int CSQLite::close()
{
return sql_close(db);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 使用方式
#include "SQLite.h"
...
...
SQL_callback addSQLtoItem(void *para, int cols, char** results, char** names)
{
CTESTDlg *dlg = (CTESTDlg*)para;
CString str; str.Format(_T("%d"), count + 1);
dlg->m_lHistory.InsertItem(count, str);
str.Format(_T("%.1f"), atof(results[0]));
dlg->m_lHistory.SetItemText(count, 1, str);
str.Format(_T("%.1f"), atof(results[1]));
dlg->m_lHistory.SetItemText(count, 2, str);
str = results[2];
dlg->m_lHistory.SetItemText(count, 3, str);
count++;
return 0;
}
...
...

char *dbfile = "sql.db";
char *sqlstring= "select * from test";
CSQLite sql;
sql.open(dbfile);
sql.query(sqlstring,(SQL_callback)addSQLtoItem, this);
sql.close();
...
...

由于官网没有现成的 .h .lib .dll 三件套,要用的话需要自己去编译,好在官网提供了编译好的 .dll .def 两件套,所以我用显示调用DLL动态库的方式使用SQLite3。

为了方便调用DLL里面的函数,我将SQLite3内的主要函数封装成一个类CSQLite,并简单封装出了三个函数:

  • open(const char*) 打开或建立数据库
  • query(const char*, SQL_callback select_callback =NULL ,void *para=NULL); 执行sql语句以及处理查询结果
  • close() 关闭数据库

目前来看,这个类足以满足项目的需求了。

最后来看一下效果吧

虽然很不要脸,但是还请您多多打赏 ^_^