bcp_init
대량 복사 작업을 초기화합니다.
구문
RETCODE bcp_init (
HDBC hdbc,
LPCTSTR szTable,
LPCTSTR szDataFile,
LPCTSTR szErrorFile,
INT eDirection);
인수
hdbc
대량 복사가 가능한 ODBC 연결 핸들입니다.szTable
복사의 원본 또는 대상이 될 데이터베이스 테이블의 이름입니다. 이 이름은 데이터베이스 이름 또는 소유자 이름도 포함할 수 있습니다. 예를 들어 pubs.gracie.titles, pubs..titles, gracie.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 연결 핸들을 지정해야 합니다. 핸들을 설정하려면 SQLSetConnectAttr에 SQL_COPT_SS_BCP를 사용하고, 할당되었지만 연결되지 않은 연결 핸들에 대해 SQL_BCP_ON을 설정합니다. 연결된 핸들에 특성을 할당하려고 하면 오류가 발생합니다.
데이터 파일이 지정되면 bcp_init는 데이터 파일을 검사하지 않고 데이터베이스 원본 또는 대상 테이블의 구조를 검사합니다. bcp_init는 데이터베이스 테이블, 뷰 또는 SELECT 결과 집합의 각 열에 따라 데이터 파일에 대한 데이터 형식 값을 지정합니다. 이러한 사양에는 각 열의 데이터 형식, 데이터에 길이 또는 Null 표시자 및 종결자 바이트 문자열이 있는지 여부, 고정 길이 데이터 형식의 길이가 포함됩니다. bcp_init는 이러한 값을 다음과 같이 설정합니다.
지정되는 데이터 형식은 데이터베이스 테이블, 뷰 또는 SELECT 결과 집합에 있는 열의 데이터 형식입니다. 데이터 형식은 sqlncli.h에 지정된 SQL Server 네이티브 데이터 형식으로 열거됩니다. 데이터 자체는 해당 컴퓨터 형식으로 표현됩니다. 즉, integer 데이터 형식의 열에서 가져온 데이터는 데이터 파일을 만든 컴퓨터에 따라 Big Endian 또는 Little Endian인 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 sqlncli10.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);
}