DB-Library から ODBC への一括コピーの変換

SQL Server Native Client ODBC ドライバでサポートされている一括コピー関数と DB-Library の一括コピー関数は類似しているので、DB-Library の一括コピー プログラムは簡単に ODBC に変換できます。ただし、この 2 種類の関数は次の点が異なります。

  • DB-Library アプリケーションでは、DBPROCESS 構造体を指すポインタを一括コピー関数の最初のパラメータに渡します。ODBC アプリケーションでは、DBPROCESS ポインタが ODBC 接続ハンドルに置き換わります。

  • DB-Library アプリケーションでは、接続する前に BCP_SETL を呼び出し、DBPROCESS での一括コピー操作を有効にします。それに対して、ODBC アプリケーションでは、次のように、接続する前に SQLSetConnectAttr を呼び出し、接続ハンドルでの一括操作を有効にします。

    SQLSetConnectAttr(hdbc, SQL_COPT_SS_BCP,
        (void *)SQL_BCP_ON, SQL_IS_INTEGER);
    
  • SQL Server Native Client ODBC ドライバでは、DB-Library のメッセージ ハンドラとエラー ハンドラがサポートされません。つまり、ODBC 一括コピー関数で発生したエラーやメッセージを表示するには、SQLGetDiagRec を呼び出す必要があります。ODBC バージョンの一括コピー関数は、標準的な一括コピーのリターン コードである SUCCEED または FAILED を返しますが、SQL_SUCCESS や SQL_ERROR など、ODBC 形式のリターン コードを返しません。

  • DB-Library bcp_bindvarlen パラメータに指定される値は、ODBC bcp_bindcbData パラメータとは解釈が異なります。

    条件

    DB-Library の varlen

    ODBC の cbData

    NULL 値が指定された場合

    0

    -1 (SQL_NULL_DATA)

    可変長のデータが指定された場合

    -1

    -10 (SQL_VARLEN_DATA)

    長さが 0 の文字列またはバイナリ文字列の場合

    なし

    0

    DB-Library では、varlen 値が -1 の場合、可変長のデータが指定されていることを示します。ODBC では、cbData が -1 の場合、NULL 値だけが指定されていることを示します。DB-Library で -1 が指定される varlen を SQL_VARLEN_DATA に、0 が指定される varlen を SQL_NULL_DATA に変更してください。

  • DB-Library bcp_colfmtfile_collen と ODBC bcp_colfmtcbUserData では、既に説明した bcp_bindvarlen パラメータと cbData パラメータと同じ問題が発生します。DB-Library で -1 が指定される file_collen を SQL_VARLEN_DATA に、0 が指定される file_collen を SQL_NULL_DATA に変更してください。

  • ODBC bcp_control 関数の iValue パラメータは void ポインタです。DB-Library では、iValue が整数でした。ODBC iValue の値は void * にキャストされます。

  • bcp_control の BCPMAXERRS オプションは、一括コピー操作が失敗するまでに、発生してもかまわないエラーの行数を指定します。BCPMAXERRS の既定値は、DB-Library バージョンの bcp_control では 0 (最初のエラーで失敗)、ODBC バージョンでは 10 です。既定値の 0 に依存して一括コピーを終了する DB-Library アプリケーションを変換する場合は、ODBC bcp_control を呼び出して BCPMAXERRS を 0 に設定するように変更する必要があります。

  • ODBC bcp_control 関数は、DB-Library バージョンの bcp_control ではサポートされていない次のオプションをサポートします。

    • BCPODBC

      TRUE に設定した場合、文字形式で保存されている datetime 値と smalldatetime 値に、ODBC タイムスタンプ エスケープ シーケンスのプレフィックスとサフィックスが使用されることを示します。これは、BCP_OUT 操作に対してのみ適用されます。

      BCPODBC を FALSE に設定した場合は、文字列に変換された datetime 値が次のように出力されます。

      1997-01-01 00:00:00.000
      

      BCPODBC を TRUE に設定した場合は、同じ datetime 値が次のように出力されます。

      {ts '1997-01-01 00:00:00.000' }
      
    • BCPKEEPIDENTITY

      TRUE に設定した場合、一括コピー関数で、ID 制約を含む列に対して指定したデータ値が挿入されることを示します。このオプションを設定しないと、挿入される行に対して新しい ID 値が生成されます。

    • BCPHINTS

      一括コピーのさまざまな最適化を指定します。このオプションは、SQL Server 6.5 以前のバージョンでは使用できません。

    • BCPFILECP

      一括コピー ファイルのコード ページを指定します。

    • BCPUNICODEFILE

      キャラクタ モードの一括コピー ファイルが Unicode ファイルであることを指定します。

  • ODBC bcp_colfmt 関数は、ODBC SQLCHAR typedef と競合するので、SQLCHAR の file_type インジケータをサポートしません。bcp_colfmt ではなく SQLCHARACTER を使用してください。

  • ODBC バージョンの一括コピー関数では、文字列の datetime 値と smalldatetime 値を使用する場合の形式は、ODBC の yyyy-mm-dd hh:mm:ss.sss 形式になります。つまり、smalldatetime 値では、ODBC の yyyy-mm-dd hh:mm:ss 形式を使用します。

    DB-Library バージョンの一括コピー関数では、次の複数の形式を使用して、文字列の datetime 値および smalldatetime 値を受け取ります。

    • 既定の形式は mmm dd yyyy hh:mmxx です。ここで、xx は AM または PM を表します。

    • DB-Library dbconvert 関数でサポートされる任意の形式の datetime 文字列および smalldatetime 文字列です。

    • SQL Server クライアント ネットワーク ユーティリティの DB-Library の [オプション] タブで [国際対応の設定の使用] チェック ボックスをオンにすると、DB-Library の一括コピー関数でも、クライアント コンピュータ レジストリのロケール設定に定義された地域別の日付形式のデータを使用できます。

    DB-Library の一括コピー関数では、ODBC の datetime 形式と smalldatetime 形式は受け取りません。

    SQL_SOPT_SS_REGIONALIZE ステートメント属性を SQL_RE_ON に設定すると、ODBC の一括コピー関数はクライアント コンピュータのレジストリのロケール設定に定義された地域別の日付形式のデータを受け取ります。

  • money 値を文字形式で出力するときは、ODBC の一括コピー関数では、4 桁の有効桁数が指定され、コンマは区切り記号として使用されません。それに対して、DB-Library バージョンでは、2 桁の有効桁数が指定され、コンマが区切り記号として使用されます。