从C+;向SQL表中的整数列发送空值+;应用 < >我正在对SQL Server 2005表进行程序变量的批量复制,在C++应用程序中使用 bCPyBoin < /C>和 BCPysDeNord

从C+;向SQL表中的整数列发送空值+;应用 < >我正在对SQL Server 2005表进行程序变量的批量复制,在C++应用程序中使用 bCPyBoin < /C>和 BCPysDeNord,c++,sql-server-2005,bind,bcp,C++,Sql Server 2005,Bind,Bcp,但是,表中的某些整数列允许null值。当需要为其中一列发送null值时,我不太确定如何在运行时使用bcp\u sendrow发送null值 在bcp_bind上显示: 将包含绑定的空值的行大容量复制到服务器 列中,实例的iIndicator成员的值应设置为 SQL\u空\u数据 然而,这仍然不能让事情变得很清楚。我是否应该对bcp\u sendrow进行两种不同的调用:一种用于非空情况,另一种用于空情况?SQL server批量复制接口有两种不同的方法来声明空值: 您可以将SQL_NULL_数据

但是,表中的某些整数列允许
null
值。当需要为其中一列发送
null
值时,我不太确定如何在运行时使用
bcp\u sendrow
发送
null

bcp_bind
上显示:

将包含绑定的空值的行大容量复制到服务器 列中,实例的iIndicator成员的值应设置为 SQL\u空\u数据


然而,这仍然不能让事情变得很清楚。我是否应该对
bcp\u sendrow
进行两种不同的调用:一种用于非空情况,另一种用于空情况?

SQL server批量复制接口有两种不同的方法来声明空值:

  • 您可以将SQL_NULL_数据指定为bcp_绑定的cbData参数。这表示发送到服务器的所有行都将为空

  • 可以使用指示符变量说明列何时包含整数以及何时包含NULL。要做到这一点,您需要在int之前为64位指示符变量留出空间。文档在一个小结构中显示了这一点,如下所示:

    typedef struct tagBCPBOUNDINT
    {
    __int64 iIndicator;
    int Value;
    } BCPBOUNDINT;
    
    (我在这里将iIndicator更改为显式64位整数;重要的是它不能更短。)

    调用bcp_bind时,指向结构而不是值,并指定使用的是8字节指示符,数据长度是可变的

    bcp_bind(hdbc, &local_struct, 8, SQL_VARLEN_DATA, NULL, 0, SQLINT4, colIndex);
    
    要发送此列中包含数据的行,请将iIndicator设置为整型字段(4)的大小,并将值放入值中。如果列应为null,则将iIndicator设置为SQL_null_DATA,不必担心该值:

    if (my_int_is_null) {
        local_struct.iIndicator = SQL_NULL_DATA;
    } else {
        local_struct.iIndicator = sizeof(int);
        local_struct.Value = my_int_value;
    }
    /* Fill the rest of the columns in a similar way */
    /* ... */
    /* finally, queue the row */
    bcp_sendrow(hdbc);
    

  • 谢谢你,伊恩。我使用了SQLUSMALLINT,必须将地址转换为BYTE*
    bcp_bind(m_hdbc,(BYTE*)&mystruct,8,SQL_VARLEN_DATA,NULL,(INT)NULL,SQLINT1,colno)
    还没有测试过它,但我希望它能工作,我对u int64有点怀疑,考虑到我必须按照bcp_bindYes的要求将结构强制转换为无符号字符*,但无论数据类型如何,都必须将所有内容强制转换为
    无符号字符*
    。重要的是,如果希望能够在其中使用
    SQL\u NULL\u DATA
    ,请为指示符值保留8个字节。我确实保留了8个字节,但由于某种原因bcp\u sendrow()失败。让我试着发布代码降价是不起作用的,我只是不能解决它现在,因为我必须满足最后期限。如果你能复印出来看看,那就太好了。在调用bcp_sendrow()之前,有两个for循环,一个用于绑定,另一个用于实际插入