3


C++ から ODBC を呼び出して、400KB を超えるオブジェクトを varbinary(max) 列に保存しようとすると、大きな問題が発生します。

SqlPrepare、SQLBindParameter、SQLExecute、SQLPutData を呼び出す基本的なワークフローは次のとおりです (最後のものは何度も)。

SqlPrepare :
StatementHandle 0x019141f0
StatementText "UPDATE DT460 SET DI024543 = ?, DI024541 = ?, DI024542 = ? WHERE DI006397 = ? AND DI008098 = ?"
テキストの長さ 93

最初のパラメーター (BLOB フィールド) のバインディング:
SQLBindParameter :
StatementHandle 0x019141f0 ParameterNumber
1 InputOutputType 1
ValueType
-2 (SQL_C_BINARY) ParameterType
-4 (SQL_LONGVARBINARY )




SQLExecute :
StatementHandle 0x019141f0

SQLPutData を数回呼び出して、32K のチャンクで BLOB を保存しようとします:
SQLPutData :
StatementHandle 0x019141f0 32768
文字の std::vector の DataPtr アドレス

最初の 32KB のデータを使用した最初の SQLPutData 操作中に、次の SQL Server エラーが発生しました:
[HY000][Microsoft][ODBC SQL Server Driver]Warning: Partial insert/update. テキスト列またはイメージ列の挿入/更新に失敗しました。
これは、サイズが 400KB を超えるオブジェクトを保存しようとすると常に発生します。400KB より小さいものを保存することは問題なく機能します。
重要なパラメーターは SQLBindParemter の ColumnSize であることがわかりました。SQLBindParameter 中のパラメーター StrLenOrIndPtr は、より低い値 (32K など) を持つことができますが、それでも同じエラーが発生します。
しかし、SQL Server API によると、32KB より小さいデータのチャンクで SQLPutData を呼び出す限り、これが問題になる理由がわかりません。

問題が何であるかを知っている人はいますか?
どんな助けでも大歓迎です。

4

1 に答える 1

3

わかりました、これは実際には SQL ドライバーの問題であることがわかりました! 最新バージョンの Microsoft® SQL Server® 2012 Native Client ( http://www.microsoft.com/de-de/download/details.aspx?id=29065から) をインストールした後、より大きな BLOB を保存すると、これらのパラメーターが正確に使用されます。その上。

于 2012-08-07T11:57:29.240 に答える