当DB兼容级别> 1时,ADO返回错误数据。 90

时间:2014-03-23 13:50:46

标签: c++ sql sql-server compatibility-level

我有一个连接到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数据?

0 个答案:

没有答案