0

プログラム変数を SQL Server 2005 テーブルに一括コピーしており、C++ アプリケーションでbcp_bindandを使用しています。bcp_sendrow

ただし、テーブル内の一部の整数列にはnull値が許可されています。列の1つの値を送信する必要が生じたときに、null実行時に値を送信する方法がよくわかりません。bcp_sendrownull

ドキュメンテーションは次のようにbcp_bind述べています:

バインドされた列の NULL 値を含む行をサーバーに一括コピーするには、インスタンスの iIndicator メンバーの値を SQL_NULL_DATA に設定する必要があります。

しかし、これはまだ物事を明確にするものではありません。への2 つの異なる呼び出しがあるはずbcp_sendrowですか? 1 つは非 null ケース用で、もう 1 つは null ケース用ですか?

4

1 に答える 1

0

SQL サーバーの一括コピー インターフェイスには、NULL 値を宣言するための 2 つの異なる方法があります。

  1. bcp_bind への cbData パラメータとして SQL_NULL_DATA を指定できます。これは、サーバーに送信されるすべての行が 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);
    
于 2012-09-25T06:26:34.977 に答える