bcp_init

一括コピー操作を初期化します。

構文

RETCODE bcp_init ( 
        HDBC hdbc, 
        LPCTSTR szTable, 
        LPCTSTR szDataFile, 
        LPCTSTR szErrorFile, 
        INT eDirection);

引数

  • hdbc
    一括コピーが有効な ODBC 接続ハンドルです。

  • szTable
    コピー操作の対象になるデータベース テーブルの名前です。 この名前には、データベース名または所有者名を含めることもできます。 たとえば、pubs.gracie.titlespubs..titlesgracie.titles、および titles はすべて有効なテーブル名です。

    eDirection を DB_OUT に設定している場合は、szTable をデータベース ビューの名前にすることもできます。

    eDirection を DB_OUT に設定し、bcp_exec を呼び出す前に bcp_control を使用して SELECT ステートメントを指定する場合は、bcp_initszTable を NULL に設定する必要があります。

  • szDataFile
    コピー操作の対象になるユーザー ファイルの名前です。 bcp_sendrow を使用して変数から直接データをコピーしている場合は、szDataFile を NULL に設定します。

  • szErrorFile
    進行状況メッセージ、エラー メッセージ、および何かの理由でユーザー ファイルからテーブルにコピーできなかった任意の行のコピーを書き込むエラー ファイルの名前です。 szErrorFile に NULL が渡されると、エラー ファイルは使用されません。

  • eDirection
    コピーの方向です。この値は DB_IN または DB_OUT になります。 DB_IN は、プログラム変数またはユーザー ファイルからテーブルへのコピーを示します。 DB_OUT は、データベース テーブルからユーザー ファイルへのコピーを示します。 DB_OUT を指定する場合は、ユーザー ファイル名を指定する必要があります。

戻り値

SUCCEED または FAIL を返します。

説明

bcp_init は、他の一括コピー関数を呼び出す前に呼び出します。 bcp_init は、ワークステーションと SQL Server 間のデータの一括コピーに必要な初期化を実行します。

bcp_init 関数には、一括コピー関数で使用できる ODBC 接続ハンドルを指定する必要があります。 このハンドルを有効にするには、割り当て済みの、接続されていない接続ハンドルで、SQL_COPT_SS_BCP を SQL_BCP_ON に設定して、SQLSetConnectAttr を使用します。 接続済みのハンドルの属性を割り当てようとすると、エラーが発生します。

データ ファイルを指定すると、そのデータ ファイルではなく、データベースのコピー元またはコピー先のテーブルの構造が bcp_init で調査されます。 bcp_init では、データベース テーブル、ビュー、または SELECT 結果セットの各列に基づいて、データ ファイルのデータ形式値を指定します。 このデータ形式値には、各列のデータ型、長さや NULL のインジケーターとターミネータのバイト文字列がデータ内に存在するかどうか、および固定長データ型の幅の指定などが含まれます。 bcp_init では、これらの値を次のように設定します。

  • 指定するデータ型は、データベース テーブル、ビュー、または SELECT 結果セット内の列のデータ型です。 データ型は、sqlncli.h に指定されている SQL Server ネイティブ データ型によって列挙されます。 データ自体はそのコンピューターの形式で表されます。 つまり、integer データ型の列のデータは、データ ファイルを作成したコンピューターに基づいて、ビッグ エンディアンまたはリトル エンディアンの 4 バイト シーケンスで表されます。

  • データベースのデータ型が固定長の場合は、データ ファイルのデータも固定長になります。 データを処理する一括コピー関数 (bcp_exec など) では、データ行が解析されます。データ ファイル内のデータの長さは、データベース テーブル、ビュー、または SELECT 列リスト内で指定されるデータの長さと同じでなければなりません。 たとえば、char(13) で定義されているデータベース列のデータは、ファイル内の各データ行では 13 文字で表す必要があります。 データベース列で NULL 値を許容する場合は、固定長データにプレフィックスとして NULL インジケーターを付けることができます。

  • ターミネータ バイト シーケンスを定義すると、ターミネータ バイト シーケンスの長さが 0 に設定されます。

  • データを SQL Server にコピーするときは、データ ファイルにデータベース テーブル内の各列に格納するデータが含まれている必要があります。 データを SQL Server からコピーするときは、データベース テーブル、ビュー、または SELECT 結果セット内のすべての列のデータがデータ ファイルにコピーされます。

  • データを SQL Server にコピーするときは、データ ファイル内の列の序数位置がデータベース テーブル内の列の序数位置と同じであることが必要です。 データを SQL Server からコピーするときは、bcp_exec によりデータベース テーブル内の列の序数位置に基づいてデータが配置されます。

  • データベースのデータ型が可変長 (varbinary(22) など) の場合、またはデータベース列に NULL 値を含めることができる場合は、データ ファイル内のデータにプレフィックスとして長さのインジケーターや NULL インジケーターを付けることができます。 インジケーターの幅は、データ型と一括コピーのバージョンによって異なります。

データ ファイルに指定されているデータ形式の値を変更するには、bcp_columnsbcp_colfmt を呼び出します。

インデックスを含まないテーブルの場合は、データベース復旧モデルを SIMPLE または BULK_LOGGED に設定することで、SQL Server への一括コピーを最適化できます。 詳細については、「一括インポートで最小ログ記録を行うための前提条件」および「ALTER DATABASE」を参照してください。

データ ファイルを使用しない場合は、列ごとにデータの形式とメモリ内の場所を指定して bcp_bind を呼び出してから、bcp_sendrow を使用して SQL Server にデータ行をコピーする必要があります。

このサンプルでは、ODBC bcp_init 関数をフォーマット ファイルと共に使用する方法を示します。

この C++ コードをコンパイルして実行する前に、次の手順を実行する必要があります。

  • Test という ODBC データ ソースを作成し、 任意のデータベースに関連付けます。

  • そのデータベースに対して次の Transact-SQL を実行します。

    CREATE TABLE BCPDate (cola int, colb datetime);
    
  • アプリケーションを実行するディレクトリに Bcpfmt.fmt というファイルを追加して、そのファイルに次の内容を追加します。

    8.0
    2
    1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin
    2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin
    
  • アプリケーションを実行するディレクトリに Bcpodbc.bcp というファイルを追加して、そのファイルに次の内容を追加します。

    1
    2
    

以上で、この C++ コードをコンパイルして実行できるようになりました。

// compile with: odbc32.lib sqlncli11.lib
#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>

SQLHENV henv = SQL_NULL_HENV;
HDBC hdbc1 = SQL_NULL_HDBC; 

void Cleanup() {
   if (hdbc1 != SQL_NULL_HDBC) {
      SQLDisconnect(hdbc1);
      SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
   }

   if (henv != SQL_NULL_HENV)
      SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

int main() {
   RETCODE retcode;
   SDWORD cRows;

   // Allocate the ODBC environment and save handle.
   retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
      printf("SQLAllocHandle(Env) Failed\n\n");
      Cleanup();
      return(9);
   }

   // Notify ODBC that this is an ODBC 3.0 app.
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
      printf("SQLSetEnvAttr(ODBC version) Failed\n\n");
      Cleanup();
      return(9);    
   }

   // Allocate ODBC connection handle, set BCP mode, and connect.
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
      printf("SQLAllocHandle(hdbc1) Failed\n\n");
      Cleanup();
      return(9);
   }

   retcode = SQLSetConnectAttr(hdbc1, SQL_COPT_SS_BCP, (void *)SQL_BCP_ON, SQL_IS_INTEGER);
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
      printf("SQLSetConnectAttr(hdbc1) Failed\n\n");
      Cleanup();
      return(9);
   }

   // Sample uses Integrated Security. Create SQL Server DSN using Windows NT authentication.
   retcode = SQLConnect(hdbc1, (UCHAR*)"Test", SQL_NTS, (UCHAR*)"", SQL_NTS, (UCHAR*)"", SQL_NTS);
   if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
      printf("SQLConnect() Failed\n\n");
      Cleanup();
      return(9);
   }

   // Initialize the bulk copy.
   retcode = bcp_init(hdbc1, "BCPDate", "BCPODBC.bcp", NULL, DB_IN);
   if ( (retcode != SUCCEED) ) {
      printf("bcp_init(hdbc1) Failed\n\n");
      Cleanup();
      return(9);
   }

   // Read the format file.
   retcode = bcp_readfmt(hdbc1, "BCPFMT.fmt");
   if ( (retcode != SUCCEED) ) {
      printf("bcp_readfmt(hdbc1) Failed\n\n");
      Cleanup();
      return(9);
   }

   // Execute the bulk copy.
   retcode = bcp_exec(hdbc1, &cRows);
   if ( (retcode != SUCCEED) ) {
      printf("bcp_exec(hdbc1) Failed\n\n");
      Cleanup();
      return(9);
   }

   printf("Number of rows bulk copied in = %d.\n", cRows);

   // Cleanup
   SQLDisconnect(hdbc1);
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
   SQLFreeHandle(SQL_HANDLE_ENV, henv);
}

関連項目

参照

一括コピー関数