Loading... > “明知道屎难吃的情况下,还要去用手捏一下,凑到鼻子上闻一下,再嚼碎了咽下去”能够相当贴切的形容MFC+ACCESS的组合。 # 一.方案 1. 调用COM组件:`msado15.dll` 2. ODBC方式 3. CDatabase CLASS 4. CDaoDataBase CLASS`[deprecated]` # 二.选择吃"屎"的方式 因为需要随时切换mdb文件,将数据导出来就完事,不适合采用ODBC的方式。 反复在x86和x64下调用`msado15.dll`COM组件,都没能成功。 ... ... 在艰难的逐个尝试后,采用了CDaoDataBase打开mdb文件,使用CDaoRecordset进行数据读取(查询)的方式,进行mdb数据读操作。 缺点: 1. CDaoDataBase、CDaoRecordset,都被标注为deprecated。 2. 不支持x64架构。 3. 读取方式麻烦,不支持orm方式读写。 # 三.mdb文件打开与关闭 添加头文件引用`#include <afxdao.h>` 添加变量申明`CDaoDatabase* mdb = nullptr` ## mdb初始化 ```c++ //mdb初始化 if(mdb == nullptr) mdb = new CDaoDatabase; ``` ## 关闭mdb ```c++ //如果mdb文件处于打开状态,关闭 if (mdb->IsOpen()) mdb->Close(); ``` ## 打开mdb ```c++ //打开数据库 mdb->Open(fileName); ``` ## 判断是否打开 ```c++ //判断是否成功打开 if (!mdb->IsOpen()) { return; } ``` # 四.数据读取 ## CDaoRecordset初始化 ```c++ //初始化dbset if(dbset == nullptr) dbset = new CDaoRecordset(mdb); ``` ## 使用SQL查询数据表 ```c++ //查询Device子表 dbset->Open(AFX_DAO_USE_DEFAULT_TYPE, _T("SELECT * FROM Device"), NULL); ``` ## 数据读取 ```c++ //数据库字段操作变体类型 COleVariant var; // 字段类型 var.ChangeType(VT_BSTR, NULL); // 此处需要使用VT_BSTR类型,否则会出错,还不清楚原因 CString strName; //value值 //循环读取查询set中数据项 while (!dbset->IsEOF()) //是否到达查询末尾 { //获取DevName字段值 var = dbset->GetFieldValue(_T("DevName")); //char[]类型,需要使用COleVariant.pbstrVal获取 strName = (LPCSTR)var.pbstrVal; m_cmb_device.AddString(strName); //转到下一个查询对象 dbset->MoveNext(); } //关闭查询 dbset->Close(); ``` 最后修改:2022 年 05 月 11 日 09 : 56 PM © 允许规范转载