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()函数里,程序编译、执行,

所提问题得到解决。