程序中同时使用DAO和ADO连接数据库

因为项目中以前是用DAO连接ACCESS数据,现在需要连接sqlserver数据库。在网上找了下DAO方式连接SQLSERVER没有相关资源,好像不支持。于是就是ADO方式连接sqlserver数据库。

可以把ADO部分代码加进来后编译时弹出重复定义的错误。

大概如下

e:\wbt\源程序\aicc\debug\msado15.tlh(169) : error C2011: 'LockTypeEnum' : 'enum' type redefinition
e:\wbt\源程序\aicc\debug\msado15.tlh(212) : error C2011: 'DataTypeEnum' : 'enum' type redefinition
e:\wbt\源程序\aicc\debug\msado15.tlh(256) : error C2011: 'FieldAttributeEnum' : 'enum' type redefinition
e:\wbt\源程序\aicc\debug\msado15.tlh(277) : error C2011: 'EditModeEnum' : 'enum' type redefinition
e:\wbt\源程序\aicc\debug\msado15.tlh(285) : error C2011: 'RecordStatusEnum' : 'enum' type redefinition
还有类似以下的错误

error   c2872:   'datatypeenum'   :   ambiguous   symbol

 error   c2872:   'parameterdirectionenum'   :   ambiguous   symbol  

出现这些错误基本都是DAO和ADO中有重复定义。

在网口找了很久,大概知道方向,用名字空间或rename,但没有人具体说方案。

下面说下具体解决方案:

1.在你的ADO的头文件中加入以下

#pragma warning (disable: 4146)
// CG : In order to use this code against a different version of ADO, the appropriate
// ADO library needs to be used in the #import statement
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF","adoEOF") rename("BOF","adoBOF") rename("DataTypeEnum","adoDataTypeEnum") \
	rename("FieldAttributeEnum", "adoFielAttributeEnum") rename("ParameterDirectionEnum", "adoParameterDirectionEnum") rename("EditModeEnum", "adoEditModeEnum") \
	rename("LockTypeEnum", "adoLockTypeEnum") rename("RecordStatusEnum", "adoRecordStatusEnum") \
	rename("_RecordsetPtr","ado_RecordsetPtr") rename("_ConnectionPtr","ado_ConnectionPtr")\
	rename("FieldPtr","ado_FieldPtr") 
using namespace ADODB;
#pragma warning (default: 4146)

最后关键的一步,在代码中把用到的结构体DataTypeEnum,FieldAttributeEnum等改为重命名后的adoDataTypeEnum,adoFielAttributeEnum。最后编译成功。


有些奇怪的是代码用到的_RecordsetPtr的指针却不用改成上述重命名的ado_RecordsetPtr,但是你不用上述重命名又会编译失败。

猜你喜欢

转载自blog.csdn.net/shejiannan/article/details/52243647