bcp_init
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
一括コピー操作を初期化します。
構文
RETCODE bcp_init (
HDBC hdbc,
LPCTSTR szTable,
LPCTSTR szDataFile,
LPCTSTR szErrorFile,
INT eDirection);
Unicode 名と ANSI 名:
- bcp_initA (ANSI)
- bcp_initW (Unicode)
引数
hdbc
一括コピーが有効な ODBC 接続ハンドルです。
szTable
コピー操作の対象になるデータベース テーブルの名前です。 この名前には、データベース名または所有者名を含めることもできます。 たとえば、 pubs.gracie.titles、 pubs などです。titles、 gracie.titles、および titles はすべて有効なテーブル名です。
eDirectionがDB_OUTの場合、szTable をデータベース ビューの名前にすることもできます。
eDirectionがDB_OUTされ、bcp_execが呼び出される前にbcp_controlを使用して SELECT ステートメントを指定する場合は、bcp_init szTable を NULL に設定する必要があります。
szDataFile
コピー操作の対象になるユーザー ファイルの名前です。 bcp_sendrowを使用して変数からデータを直接コピーする場合は、szDataFile を NULL に設定します。
szErrorFile
進行状況メッセージ、エラー メッセージ、および何かの理由でユーザー ファイルからテーブルにコピーできなかった任意の行のコピーを書き込むエラー ファイルの名前です。 NULL が szErrorFile として渡された場合、エラー ファイルは使用されません。
eDirection
コピーの方向です。この値は DB_IN または DB_OUT になります。 DB_IN は、プログラム変数またはユーザー ファイルからテーブルへのコピーを示します。 DB_OUT は、データベース テーブルからユーザー ファイルへのコピーを示します。 DB_OUT を指定する場合は、ユーザー ファイル名を指定する必要があります。
返品
SUCCEED または FAIL。
解説
他の一括コピー関数を呼び出す前に、 bcp_init を呼び出します。 bcp_init は、ワークステーションと SQL Server の間のデータの一括コピーに必要な初期化を実行します。
bcp_init関数には、一括コピー関数で使用できる ODBC 接続ハンドルが用意されている必要があります。 ハンドルを有効にするには、 SQLSetConnectAttr を使用しSQL_COPT_SS_BCP割り当てられた接続ハンドル (接続されていない) でSQL_BCP_ONに設定します。 接続済みのハンドルの属性を割り当てようとすると、エラーが発生します。
データ ファイルを指定すると、 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_columns と bcp_colfmtを呼び出します。
SQL Server への一括コピーは、データベース復旧モデルを SIMPLE または BULK_LOGGED に設定することで、インデックスを含まないテーブルに最適化できます。 詳細については、「一括インポートでの最小ログ記録の前提条件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);
}