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位都可以正常运行,本人亲测

 

posted @ 2015-09-20 00:37  腾飞梦龙  阅读(692)  评论(0)    收藏  举报