运行环境:
系统:Win10
IDE:Visual Studio 2022
wxsqlite3版本:wxsqlite3-4.9.4
wxWidgets 版本:wxWidgets-3.2.2.1
(1)下载wxWidgets,安装和编译
https://www.wxwidgets.org/downloads/
- 下载完成后安装,安装到:D:\Program\wxWidgets
进入D:\Program\wxWidgets\build\msw,根据你的VS版本打开对应的解决方案,比如若使用vs2022,则选择wx_vc17.sln,点击Visual Studio顶部的生成菜单–>批生成–>全选–>点击生成。 - 这样在 D:\Program\wxWidgets\lib目录下生成vc_dll、vc_lib、vc_x64_dll、vc_x64_lib四个文件夹,每个文件夹的mswu\wx有一个setup.h。
把文件夹名字vc后面加上对应你的vs的版本数字,vs2022对应14x。如果不修改,编译的时候找不到路径。
(2)设置环境变量
在环境变量里添加WXWIN变量,指向wxWidgets的安装目录。
- 变量名:WXWIN
- 变量值:D:\Program\wxWidgets
(3)下载wxSqlite3,并解压缩
https://github.com/utelle/wxsqlite3
解压缩到D:\Program\wxSqlite3
(4)编译wxSqlite3
- 要事先按照上面(2)所示设置好环境变量WXWIN,下面的sln工程文件读取wx_setup.props进行编译参数的设置,根据$(WXWIN)变量来查找wxWidgets的安装目录,然后设置“附加包含目录”和“附加库目录”等。这样wxsqlite可以找到需要的头文件和库,不需要再在vc++包含目录和库目录中添加。
- 进入build目录,用vs打开相应的工程文件。比如vs 2022,打开wxsqlite3_vc17.sln工程文件。打开工程文件后,不需要做什么,选择所需的方案比如Debug Dll Win64–x64和Debug Win64–x64进行编译即可。于是在D:\Download\wxSqlite3\lib目录下分别生成两个文件夹vc14x_x64_dll和vc14x_x64_lib,分别对应dll和lib文件。
- 源码默认加密方式为chacha20,但navicat for
sqlite中使用的是aes128。为了方便使用,可以改成和navicat一样。
添加到预处理器下面定义:CODEC_TYPE=CODEC_TYPE_AES256
(5)静态库的使用
- 拷贝wxsqlte3d.lib(如果是动态链接还要拷贝wxsqlite3d.dll)到工程目录。
- 打开wxWidgets\include\msvc\wx下的setup.h文件,第91行:#define wxCOMPILER_PREFIX vc,修改为:
#define wxCOMPILER_PREFIX vc14x。vc14x对应你的vs版本。 - 项目 ->属性 ->配置属性 ->VC++目录 ->包含目录,添加:
D:\Program\wxSqlite3\include
D:\Program\wxWidgets\include
D:\Program\wxWidgets\include\msvc - 项目 ->属性 ->配置属性 ->VC++目录 ->库目录,添加:D:\Program\wxWidgets\lib\vc14x_x64_lib
- 项目属性 ->配置属性->C/C++ ->与编译器 ->预编译器定义,按照如下设置:
NDEBUG
_CONSOLE - 点击生成,即可生成exe文件。
- 如果出现错误提示:warning LNK4099: 未找到 PDB“”(使用“wxsqlite3d.lib(wxsqlite3.obj)”或在“”中寻找);正在链接对象。
项目属性 ->配置属性->链接器 ->调试 ->生成调试信息,修改为“否”。
#include "wx/wxsqlite3.h"
#include <iostream>
using namespace std;
#pragma comment(lib, "wxsqlite3d.lib")
int main() {
wxSQLite3Database db;
db.Open(wxS("data.db"), wxS("112233"));
if (db.IsOpen()) {
// 删除数据表
wxString sqlDrop = wxT(R"""(
DROP TABLE IF EXISTS user
)""");
db.ExecuteUpdate(sqlDrop);
// 创建数据表
wxString sqlCreate = wxT(R"""(
CREATE TABLE IF NOT EXISTS user(
id INTEGER,
name VARCHAR(255),
age INTEGER,
address VARCHAR(50))
)""");
db.ExecuteUpdate(sqlCreate);
auto insa = db.PrepareStatement(wxT("INSERT INTO user(id,name,age,address) VALUES(1,'111',55,'aaaaa')"));
insa.ExecuteUpdate();
// 修改
auto stm = db.PrepareStatement(wxT("UPDATE user SET age = 30 WHERE id = ?"));
stm.Bind(1, 1);
stm.ExecuteUpdate();
// 插入数据
auto ins = db.PrepareStatement(wxT("INSERT INTO user(id,name,age,address) VALUES(5,'555',55,'bbb')"));
ins.ExecuteUpdate();
//int i = db.ExecuteUpdate(wxT("(INSERT INTO user(id,name,age,address) VALUES(4,'333',33,'bbb')"));
//printf("i=%d", i);
db.Close();
}
}
(6)特别说明
- 上面代码中,使用:db.ExecuteUpdate(wxT(“(INSERT INTO user(id,name,age,address)
VALUES(4,‘333’,33,‘pppp’)”)); 会出现abort()错误,无法插入数据,程序退出。而使用:
auto ins = db.PrepareStatement(wxT("INSERT INTO user(id,name,age,address) VALUES(5,'555',55,'ppp')"));
ins.ExecuteUpdate();
没有错误,成功插入数据。