SQL Server 2008 データベースに接続してストアド プロシージャを実行する C++ dll があります。SQL Server は、このデータベースに対して互換性レベル 80 を使用しています。サーバーへの接続は、SQL Server OLE_DB ドライバーを使用して ADO を介して行われます。お客様は、互換性レベル 90 以上のみをサポートする SQL Server 2012 にアップグレードしたいと考えています。
ストアド プロシージャは 2 つの varchar 入力値を取り、2 つの varchar と 2 つの整数出力値を返します。DLL 内の C++ コードは、7 つのバリアントを作成して初期化し、それらのバリアントを使用して ADO 接続オブジェクトのパラメーター コレクションに 7 つのパラメーターを追加します。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 パラメータでストアド プロシージャによって返される値は、データベースから読み取られた値です。この dll を SQL Server 2012 に対してテストすると、varchar 値が正しく返されません。ret_barcode VARIANT に含まれる実際の値は、テキスト「<strong>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 の間で何が変更されたか、または DB からの varchar データをサポートするために DLL で何ができるかを知っている人はいますか?