다음을 통해 공유


bcp_init

대량 복사 작업을 초기화합니다.

Syntax

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

인수

hdbc
대량 복사가 가능한 ODBC 연결 핸들입니다.

szTable
복사의 원본 또는 대상이 될 데이터베이스 테이블의 이름입니다. 이 이름은 데이터베이스 이름 또는 소유자 이름도 포함할 수 있습니다. 예를 들어 pubs.gracie.titles, pubs. 제목, gracie.titles제목은 모두 법적 테이블 이름입니다.

eDirection이 DB_OUT 경우 szTable은 데이터베이스 뷰의 이름일 수도 있습니다.

eDirection이 DB_OUT bcp_exec 호출되기 전에 bcp_control 사용하여 SELECT 문을 지정하는 경우 bcp_initszTable 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 연결 핸들과 함께 제공되어야 합니다. 핸들을 사용하도록 설정하려면 할당되었지만 연결되지 않은 연결 핸들에서 SQL_BCP_ON SQL_COPT_SS_BCP 설정된 SQLSetConnectAttr 를 사용합니다. 연결된 핸들에 특성을 할당하려고 하면 오류가 발생합니다.

데이터 파일을 지정하면 bcp_init 데이터 파일이 아닌 데이터베이스 원본 또는 대상 테이블의 구조를 검사합니다. bcp_init 데이터베이스 테이블, 뷰 또는 SELECT 결과 집합의 각 열을 기반으로 데이터 파일의 데이터 형식 값을 지정합니다. 이 지정에는 각 열의 데이터 형식, 데이터에 길이 또는 Null 표시자 및 종결자 바이트 문자열이 있는지 여부, 고정 길이 데이터 형식의 길이가 포함됩니다. bcp_init 다음과 같이 이러한 값을 설정합니다.

  • 지정되는 데이터 형식은 데이터베이스 테이블, 뷰 또는 SELECT 결과 집합에 있는 열의 데이터 형식입니다. 데이터 형식은 sqlncli.h에 지정된 SQL Server 네이티브 데이터 형식으로 열거됩니다. 데이터 자체는 해당 컴퓨터 형식으로 표현됩니다. 즉, 정수 데이터 형식 열의 데이터는 데이터 파일을 만든 컴퓨터를 기반으로 big-or 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.

데이터베이스 복구 모델을 SIMPLE 또는 BULK_LOGGED 설정하여 인덱스가 포함되지 않은 테이블에 대해 SQL Server 대량 복사를 최적화할 수 있습니다. 자세한 내용은 대량 가져오기 및 ALTER DATABASE에서 최소 로깅을 위한 필수 구성 요소를 참조하세요.

데이터 파일이 사용되지 않는 경우 bcp_bind 호출하여 각 열의 데이터 fsor 메모리에 있는 형식과 위치를 지정한 다음, 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);  
}  
  

참고 항목

Bulk Copy Functions