2024年4月18日发(作者:)
4.3.4解决V i sua I C++6. 0不能访问Access2000数据库的问题
建词库时,我们用的Access版本是2000,当在Visual C++6. 0中用MFC DAO
类访问Access2000数据库时,会得到“Unrecognized database format.”错误
消息,即“不能辨认的数据库格式”,在Access97中则没有这种错误提示,程序
能正常运行。VC6不能访问Access2000,原因何在?如何解决?作如下分析。
1.错误原因
原因是MFC使用了错误的DAO DLL。默认情况下,Visual C++6. 0使用的MFC
DAO类加载的是DA03. 5 (Dao350. dl l) 。DA03. 5使用Microsoft Jet3.5数据库引
擎,而它只能打开支持Jet3. 5或更老版本的数据库。Access2000使用支持Jet4.0
的数据库文件,它对Jet3. 5来说是不能辨认的。为了能使用MFC DAO类来操作
Access2000数据库,我们需要DA03. 6 (Dao360. d11)。DA03. 6使用Jet4. 0引擎,
它能打开任何Access数据库格式。
当MFC调用AfxDaoInit()初始化DAO时,MFC首先要判断加载了哪个版本的
DAO,如下:
void AFXAPI AfxDaoInit()
//在daocore. cpp文件中(VC安装路径MFCSRC目录下)
{..........
BYTE bUseDao=_AfxDetermineDaoVersion();
..........
switch (bUseDao)
{
case 35:
//Use
break;
case 30:
//Use
break;
case 36:
//Use DA0360. DLL
break:
}
..........
_AfxDetermineDaoVersion()依据MFC是静态的还是动态的而不同,当使用
静态的MFC时,如下:
#ifndef AFXDLL
#if _MFC_VER>=0x0601
#define _AfxDetermineDaoVersion()(36)
#else
#define _AfxDetermineDaoVersion()(35)
#endif
当使用动态的MFC时,如下:
static inline BYTE _AfxDetermineDaoVersion()
{
BYTE bReturn=35;
#ifdef _AFXDI.L
AFX_MODIJLE_STATE* pModuleState=AfxGetModuleState();
if (pModuleState-->m_dwVersion<0x421)
bReturn=30;
else if (pModuleState->m_dwVersion>=0x0601)
bReturn=36;
#endif //AFXDLL
return bReturn;
}
由以上代码可以看出,MFC使用它自己的版本号来判断DAO的版本。如果MFC
的版本是0x0601或更高,那么MFC就会使用DA03. 6,也就能访I问 Access2000
数据库了。
2.解决方法
对我们的程序来说,如果想使用DA03. 6,就必须在运行时把MFC的版本更新
为0x0601,而这又依赖于你用静态MFC还是动态MFC。如果你是用静态MFC,则
首先把daocore. cpp文件拷贝到我们的代码路径,然后作些修改,再把这个文件
加到我们的工程中去就可以了(注意,不要直接修改daocore. cpp,而是修改它
的拷贝)。修改部分如下:
#include "daoimpl.h"
#define_ countof(array)
(sizeof(array)/sizeof(array[0]))
#undef _MFC _VER
#define _MFC _VER 0x0601
把这些代码加到daocore. cpp文件的顶部就可以了。编译程序时会有一个警
告(warning)错误(对此微软没有解释),忽略它就可以了,程序正常执行,所提
问题得到解决。
如果你是用动态MFC,则在操作Access数据库之前需要插入如下代码以使用
MFC使用DA03. 6:
AfxGetModuleState()->m_ dwVersion=0x0601;
把这行代码插入到我们应用程序的Initinstance()函数里,程序编译、执行,
所提问题得到解决。


发布评论