我正在通过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(SQLBIGBINARY
,SQLBIGVARBINARY
,SQLBINARY
,...) - 同样的错误。
我已尝试将pData
设置为nullptr
以表示将通过调用bcp_moretext
来提供数据 - 同样的错误。
8K以下的绑定数据块没有任何问题。
通过类型为SQLBindParameter
(SQL_VARBINARY
)的ODBC SQL_C_BINARY
传输相同的数据,没有任何问题。
是否有机会获得批量复制功能?
谢谢!
答案 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
就像魅力一样!