0

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

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

文档bcp_bind说:

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

但是,这仍然不能使事情变得很清楚。我是否应该对 2 个不同的调用bcp_sendrow:一个用于非空情况,另一个用于空情况?

4

1 回答 1

0

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

  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。如果该列应为空,则将 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);
    
于 2012-09-25T06:26:34.977 回答