3


当我尝试在 varbinary(max) 列中保存大于 400KB 的对象时,我遇到了一个大问题,从 C++ 调用 ODBC。

这是我调用 SqlPrepare、SQLBindParameter、SQLExecute、SQLPutData(最后一个不同时间)的基本工作流程:

SqlPrepare
StatementHandle 0x019141f0
StatementText“更新 DT460 SET DI024543 = ?,DI024541 = ?,DI024542 =?哪里DI006397 =?和DI008098 =?”
文本长度 93

第一个参数(BLOB 字段)的绑定:
SQLBindParameter
StatementHandle 0x019141f0
ParameterNumber 1
InputOutputType 1
ValueType -2 (SQL_C_BINARY)
ParameterType -4 (SQL_LONGVARBINARY)
ColumnSize 427078
DecimalDigits 0
ParameterValPtr 1
BufferLength 4
StrLenOrIndPtr -427178 (27_LEN_8的结果)

SQLExecute
语句句柄 0x019141f0

尝试通过多次调用 SQLPutData 以 32K 的块保存 blob:
SQLPutData :
StatementHandle 0x019141f0
具有 32768 个字符的 std::vector 的 DataPtr 地址
StrLen_or_Ind 32768

在使用前 32KB 数据的第一个 SQLPutData 操作期间,我收到以下 SQL Server 错误:
[HY000][Microsoft][ODBC SQL Server Driver]Warning: Partial insert/update。文本或图像列的插入/更新未成功。
当我尝试保存大小超过 400KB 的对象时,总是会发生这种情况。保存小于 400KB 的内容就可以了。
我发现关键参数是 SQLBindParemter 的 ColumSize。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 回答