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输入密码来连接