vs2015编译wxsqlite3-4.7.5
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2022-04-23 16:07:18
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章
网上有很多编译wxsqlite3的文章,但都没标注版本是多少,好多都是过时的。下面编译过程对应
wxWidgets-3.1.5
wxsqlite3-4.7.5
下载 https://www.wxwidgets.org/downloads/

安装到以下位置

此时lib目录是空的,需要编译一下,打开vs2015项目文件打开编译 D:\wxWidgets-3.1.5\build\msw\wx_vc14.sln
打开后选择菜单 生成->批生成->全选->生成,把需要的库给编译出来,编译过程很慢很慢很慢30分钟左右,如果知道自己需要哪些的话,可以指定生成,时间会快很多。
成功后会在lib目录生成一些库文件,把文件夹名字vc后面加上对应vs版本的数字,vs2015对应14x, 如果不改的话路径会对不上,

下载wxsqlite源码
clone https://github.com/utelle/wxsqlite3
切换到对应的源码版本,切记,使用这篇文章标注的版本,其它版本可能有变化
打开属性管理器添加依赖的wxwidgets属性表

选择文件位置

上面这一步是为了让wxsqlite可以找到需要的头文件和库,不需要你在vc++包含目录中再添加了
源码默认加密方式为 chacha20 但navicat for sqlite中使用的是aes128 为了方便使用我这里给改成和navicat一样的了。
添加到预处理器下面定义
CODEC_TYPE=CODEC_TYPE_AES128

前面的所有准备都是为了最后这一步的成功。

新建一个空项目添加如下测试代码,注意里面的包含路径和引用库文件要设置成自己的,同样要跟上面一个添加属性列表
#include "wx/wxsqlite3.h"
#include "wx/wxsqlite3def.h"
#include "wx/wxsqlite3opt.h"
#include "wx/wxsqlite3_version.h"
#include <iostream>
using namespace std;
#ifdef _DEBUG
#pragma comment(lib, "../../lib/vc_x64_lib/Debug Win64/wxsqlite3d.lib")
#else
#pragma comment(lib, "../../lib/vc_x64_lib/Release Win64/wxsqlite3.lib")
#endif // _DEBUG
int main() {
try {
}
catch (const wxSQLite3Exception& e)
{
//wxLogDebug(e.GetMessage());
}
const wxString dbFile = wxS("E:/work/c/TestWxsqlite3/wxsqlite3-data.db");
//wxSQLite3Database::InitializeSQLite();
cout << "Cipher (default) : " << (const char*)wxSQLite3Cipher::GetCipherName(wxSQLite3Cipher::GetGlobalCipherDefault()).mb_str(wxConvUTF8) << endl;
wxSQLite3Database db;
//db.Open(wxT("wxsqlite3-data.db"));
// 使用加密方式打开
db.Open(dbFile, wxString(wxS("123456")));
cout << "Cipher (Db) : " << (const char*)wxSQLite3Cipher::GetCipherName(wxSQLite3Cipher::GetCipher(db)).mb_str(wxConvUTF8) << endl;
wxSQLite3Cipher::SetCipher(db, wxSQLite3CipherType::WXSQLITE_CIPHER_AES128);
cout << "Cipher (Db) : " << (const char*)wxSQLite3Cipher::GetCipherName(wxSQLite3Cipher::GetCipher(db)).mb_str(wxConvUTF8) << endl;
// 打开后修改密码
//if (db.IsOpen()) {
// db.ReKey(wxT("other_key"));
// db.Close();
//}
// 使用二进制密码
//if (db.IsOpen()) {
// // 生成二进制秘钥
// wxChar ch[] = wxT("hello-world");
// wxMemoryBuffer buffer;
// buffer.AppendData(ch, sizeof(ch));
// db.ReKey(buffer);
// db.Close();
//}
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 PRIMARY KEY AUTOINCREMENT,
username VARCHAR(255) NOT NULL,
age INTEGER NOT NULL,
address VARCHAR(50))
)""");
db.ExecuteUpdate(sqlCreate);
// 创建索引
wxString sqlCreateUnique = wxT(R"""(
CREATE UNIQUE INDEX username_unique ON user (username)
)""");
db.ExecuteUpdate(sqlCreateUnique);
// 插入数据
wxString sqlInsert = wxT(R"""(
INSERT INTO user VALUES (null,"yan.wang",30,"Pudong");
INSERT INTO user VALUES (null,"kan.wang",20,"Lujiazui");
)""");
//db.ExecuteUpdate(sqlInsert);
// 查询数据
wxString sqlQuery = wxT(R"""(
SELECT * FROM user
)""");
auto res = db.ExecuteQuery(sqlQuery);
while (res.NextRow())
{
//wxLogDebug(wxT("姓名:%s 年龄:%d 地址:%s"), \
res.GetString(wxT("username")), \
res.GetInt(wxT("age")), \
res.GetString(wxT("address")));
}
// 修改id为2的年龄为29岁
auto stm = db.PrepareStatement(wxT("UPDATE user SET age = 29 WHERE id = ?"));
stm.Bind(1, 2);
stm.ExecuteUpdate();
// 再次查询
stm = db.PrepareStatement(wxT("SELECT * FROM user WHERE id = ?"));
stm.Bind(1, 2);
res = stm.ExecuteQuery();
while (res.NextRow())
{
//wxLogDebug(wxT("姓名:%s 年龄:%d 地址:%s"), \
res.GetString(wxT("username")), \
res.GetInt(wxT("age")), \
res.GetString(wxT("address")));
}
db.Close();
}
system("pause");
}最后使用navicat输入密码来连接
