bug记之C++使用ado在系统32、64位问题
前言:
由于在win7上开发的,在客户机上不能正常使用。
思考:将xp下的"C:\Program Files\Common Files\System\ado"拷贝到本机上编译生成的程序不就可以了吗?
实验证明该方法是行不通的,系统上的ado有些文件是替换不掉的。
正文:
1、ado版本兼容性问题
解决方案:
将msado60_Backcompat_i386.tlb拷贝到C++项目工程中
编译时用该文件
eg
#import "msado60_Backcompat_i386.tlb" no_namespace \
rename("EOF", "adoEOF")
参考:http://blog.csdn.net/magic_andy/article/details/9225073
校正上面的说法,该方法根本不需要注册ado的dll就可以正常运行了;
已测试版本:
Microsoft Windows Server 2008 Enterprise
Microsoft Windows XP Professional(SP3)
Microsoft(R) Windows(R) XP Professional x64 Edition(SP1)
2、C++ ado 参数化访问数据库
sqlserver 利用SQL_VARIANT_PROPERTY('222', 'BaseType')可查看元数据类型
eg.select * from t where f1=?
1)编译32位时正常
2)编译64位时,报错如下
2.1数据类型 varchar 和 ntext 在 equal to 运算符中不兼容(字符串为adVarChar)
2.2数据类型 varchar 和 text 在 equal to 运算符中不兼容(字符串为adVarWChar)
测试结果为传入的参数确实是ntext
解决办法
将sql改为select * from t where f1=cast(? as varchar(64))
参考:
ado类型映射:http://www.w3school.com.cn/ado/ado_datatypes.asp
总结:
C++使用ado兼容问题处理并不是网上说的那么复杂。
1、下载文件: msado60_Backcompat_i386.tlb
2、将msado60_Backcompat_i386.tlb拷贝到C++项目工程中,并导入eg:
#import "msado60_Backcompat_i386.tlb" no_namespace \
rename("EOF", "adoEOF")
编译64或32位都可以正常运行,本人亲测

浙公网安备 33010602011771号