对于VARBINARY(MAX)列,当使用大小超过8000字节时,bcp_bind失败

时间:2014-08-25 08:59:10

标签: c++ sql sql-server odbc bulk

我正在通过SQL Server本机客户端v11使用批量复制功能(http://msdn.microsoft.com/en-us/library/ms130922.aspx)来快速将数据插入SQL Server 2012表。一切正常,除了将大(超过8K)数据块插入BLOB列(在8K下插入数据没有任何问题)。我得到关于错误的扩展信息:

HY000“数据类型”

的字段大小无效

示例C ++代码:

std::vector<char> vData(9000, 0);
BYTE* pData = &buf[0];
DBINT nLenth = buf.size();
auto nRet = bcp_bind(hHandle, pData, 0, nLength, nullptr, 0, SQLVARBINARY, 2/*Column number is  correct*/);
assert(nRet != FAIL); //Fails

表创建SQL:

CREATE TABLE [Table1] (C1 INT IDENTITY (1,1) NOT NULL, C2 VARBINARY(MAX) NULL);

我尝试了不同的数据类型valus(SQLBIGBINARYSQLBIGVARBINARYSQLBINARY,...) - 同样的错误。

我已尝试将pData设置为nullptr以表示将通过调用bcp_moretext来提供数据 - 同样的错误。

8K以下的绑定数据块没有任何问题。

通过类型为SQLBindParameterSQL_VARBINARY)的ODBC SQL_C_BINARY传输相同的数据,没有任何问题。

是否有机会获得批量复制功能?

谢谢!

1 个答案:

答案 0 :(得分:1)

回答我自己的问题:

即使bcp_bind由于某些奇怪的原因在绑定到超过8K字节的列时失败,另一个BCP函数bcp_collen也适用于相同的数据。所以解决方案代码是:

std::vector<char> vData(9000, 0);
BYTE* pData = &buf[0];
DBINT nLenth = buf.size();
auto nRet = bcp_bind(hHandle, pData, 0, 1/*or any value < 8000*/, nullptr, 0, SQLVARBINARY, 2/*Column number*/);
assert(nRet != FAIL); //OK
nRet = bcp_collen(hHandle, nLength, 2/*Column number*/);
assert(nRet != FAIL); //OK

就像魅力一样!