当我尝试在 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 就会有问题。
有谁知道问题可能是什么?
任何帮助将不胜感激。