从C++应用程序向SQL表中的整数列发送null值

Sending null values to an integer column in an SQL table from a C++ application

本文关键字:数列 整数 null 应用程序 C++ SQL      更新时间:2023-10-16

我正在将程序变量批量复制到SQL Server 2005表中,并在C++应用程序中使用bcp_bindbcp_sendrow

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

bcp_bind上的文档显示:

将包含绑定的NULL值的行大容量复制到服务器列,实例的iIndicator成员的值应设置为SQL_NULL_DATA

然而,这仍然没有让事情变得很清楚。我应该对bcp_sendrow有两个不同的调用吗:一个用于非null情况,另一个用于null情况?

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

  1. 您可以指定SQL_NULL_DATA作为bcp_bind的cbData参数。这表示发送到服务器的所有行都将是NULL的

  2. 您可以使用指示符变量来说明列何时包含整数以及何时包含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)的大小,并将值放入value中。如果列应该为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);