SqlServer错误HY000:使用varbinary(max)字段中超过400 KB的对象调用SQLPutData时




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

以下是我调用SqlPrepare、SQLBindParameter、SQLExecute、SQLPutData(最后一次调用)的基本工作流程:

SqlPrepare
StatementHandle 0x019141f0
StatementText"UPDATE DT460 SET DI024543=?,DI024541=?,DI024542=?WHERE DI006397=?AND DI008098=?"
TextLength 93

绑定第一个参数(BLOB字段):
SQLBindParameter
StatementHandle 0x019141f0
参数编号1
输入输出类型1
值类型-2(SQL_C_BINARY)
参数类型-4(SQL_LONGVARBINARY)
列大小427078
小数位数0
参数ValPtr 1
缓冲区长度4
StrLenOrIndPtr-427178(SQL_LEN_DATA_AT_EXEC(427078)的结果)

SQLExecute
语句句柄0x019141f0

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

在对前32KB的数据进行第一次SQLPutData操作时,我得到了以下SQL Server错误:
[HY000][Microsoft][ODBC SQL Server驱动程序]警告:部分插入/更新。插入/更新文本或图像列失败
当我试图保存大小超过400KB的对象时,总是会发生这种情况。保存小于400KB的内容效果很好
我发现关键参数是SQLBindParemter的ColumSize。SQLBindParameter期间的参数StrLenOrIndPtr可以具有较低的值(如32K),它仍然会导致相同的错误
但根据SQL Server API,我不明白为什么这会有问题,只要我用小于32KB的数据块调用SQLPutData。

有人知道可能是什么问题吗
如有任何帮助,我们将不胜感激。

好的,我刚刚发现这实际上是一个sql驱动程序问题!安装最新版本的Microsoft®SQL Server®2012 Native Client(来自http://www.microsoft.com/de-de/download/details.aspx?id=29065),保存更大的BLOB正是使用上面的这些参数。

最新更新