gpt4 book ai didi

c++ - 当 VARBINARY(MAX) 列的大小超过 8000 字节时,bcp_bind 失败

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:10 24 4
gpt4 key购买 nike

我正在通过 SQL Server native 客户端 v11 使用批量复制功能 ( http://msdn.microsoft.com/en-us/library/ms130922.aspx ) 将数据快速插入到 SQL Server 2012 表中。一切正常,除了将大(超过 8K)数据 block 插入 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 来提供数据 - 同样的错误。

绑定(bind) 8K 以下的数据 block 没有任何问题。

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

是否有机会使用批量复制功能?

谢谢!

最佳答案

回答我自己的问题:

即使 bcp_bind 在绑定(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

很有魅力!

关于c++ - 当 VARBINARY(MAX) 列的大小超过 8000 字节时,bcp_bind 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25482325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com