代码之家  ›  专栏  ›  技术社区  ›  Ro Man

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

  •  1
  • Ro Man  · 技术社区  · 10 年前

    我正在使用批量复制功能( http://msdn.microsoft.com/en-us/library/ms130922.aspx )通过SQL Server本机客户端v11将数据快速插入SQL Server 2012表。除了在BLOB列中插入大(超过8K)数据块(在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下绑定数据块没有任何问题。

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

    有机会实现批量复制功能吗?

    非常感谢。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Ro Man    10 年前

    回答我自己的问题:

    尽管 bcp_bind 由于某些奇怪的原因, 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
    

    工作起来很有魅力!