我有一个连接到SQL Server 2008数据库并执行存储过程的C ++ DLL。 SQL Server使用此数据库的兼容级别80。与服务器的连接是通过ADO使用SQL Server OLE_DB驱动程序完成的。客户希望升级到SQL Server 2012,它仅支持兼容级别90及以上。
存储过程接受两个varchar输入值,并返回2个varchar和2个整数输出值。 DLL中的C ++代码创建并初始化7个VARIANT,然后使用这些变量将7个参数添加到ADO连接对象的参数集合中。 VARIANT和参数类型如下:
0 VT_I4 “RETURN_VALUE” adInteger adParamReturnValue
1 VT_BSTR “barcode” adVarChar adParamInput
2 VT_BSTR “inParam2” adVarChar adParamInput
3 VT_BSTR “ret_barcode” adVarChar adParamOutput
4 VT_I4 “ret_param2” adInteger adParamOutput
5 VT_I4 “ret_param3” adInteger adParamOutput
6 VT_BSTR “return_more_rows” adVarChar adParamOutput
执行命令后,将检索输出VARIANTS的值并将其返回给调用程序。
ret_barcode参数中存储过程返回的值是从数据库读取的值。当针对SQL Server 2012测试此dll时,无法正确返回varchar值。 ret_barcode VARIANT中包含的实际值是文本“ return_more_rows ”,这是最后一个输出参数的名称!如果在存储过程的最后,我将ret_barcode参数的值设置为字符串常量,只要字符串常量为13个字符或更少,就会在C ++ dll中显示正确的值。
使用ADO.NET的简单C#测试程序按预期运行。
如果我将存储过程中的ret_barcode变量的类型更改为char(30),则会在ret_barcode VARIANT中返回正确的值。在调试时,我使用Parameter.Refresh方法来确定存储过程所期望的参数类型。在这两种情况下,ret_barcode参数都是adVarChar。这让我相信服务器打包和将数据传输到客户端的方式有所不同,具体取决于其兼容性级别。
我读到的兼容性级别似乎表明它们只是简单地公开或限制功能。是否有人知道兼容级别80和90之间发生了什么变化导致此问题或我在DLL中可以做什么来支持来自数据库的varchar数据?