当DB兼容级别为>;时,ADO返回错误数据;90 < >我有一个C++ DLL,连接到SQL Server 2008数据库并执行存储过程。SQL Server正在为此数据库使用兼容级别80。使用SQL server OLE_DB驱动程序通过ADO连接到服务器。客户希望升级到SQL Server 2012,该版本仅支持兼容级别90及以上

当DB兼容级别为>;时,ADO返回错误数据;90 < >我有一个C++ DLL,连接到SQL Server 2008数据库并执行存储过程。SQL Server正在为此数据库使用兼容级别80。使用SQL server OLE_DB驱动程序通过ADO连接到服务器。客户希望升级到SQL Server 2012,该版本仅支持兼容级别90及以上,c++,sql,sql-server,compatibility-level,C++,Sql,Sql Server,Compatibility Level,存储过程接受两个varchar输入值,并返回2个varchar和2个整数输出值。DLL中的C++代码创建并初始化7个变体,然后使用这些变体将7个参数添加到ADO连接对象的参数集合。变量和参数类型如下所示: 0 VT_I4 “RETURN_VALUE” adInteger adParamReturnValue 1 VT_BSTR “barcode” adVarChar adParamInput 2 VT_BSTR “inPar

存储过程接受两个varchar输入值,并返回2个varchar和2个整数输出值。DLL中的C++代码创建并初始化7个变体,然后使用这些变体将7个参数添加到ADO连接对象的参数集合。变量和参数类型如下所示:

 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
执行命令后,将检索输出变量的值并将其返回给调用程序

ret_barcode参数中存储过程返回的值是从数据库读取的值。针对SQL Server 2012测试此dll时,varchar值未正确返回。ret_条形码变量中包含的实际值是文本“返回更多行”,这是最后一个输出参数的名称!如果在存储过程的末尾,我将RetryBARCCODE参数的值设置为字符串常量,只要字符串常量为13个字符或更少,则在C++ DLL中显示适当的值。 一个使用ADO.NET的简单C#测试程序按预期运行

如果我将存储过程中ret_条码变量的类型更改为char(30),则ret_条码变量中将返回正确的值。调试时,我使用Parameter.Refresh方法确定存储过程所需的参数类型。在这两种情况下,ret_条码参数都是adVarChar。这使我相信,服务器打包数据和向客户机传输数据的方式是不同的,这取决于其兼容性级别


我读到的关于兼容性级别的内容似乎表明它们只是简单地公开或限制功能。有人知道兼容性级别80和90之间发生了什么变化导致了这个问题,或者我可以在DLL中做些什么来支持来自DB的varchar数据吗

尝试将
adParamOutput
更改为
adParamInputOutput
SQL Server 2008应在100运行,80为2000,90为2005。您可能有一些从未更新过的旧代码。我将查看存储的proc,看看是否可以更新它以在当前的2008环境中运行它。