bcp_exec
데이터베이스 테이블과 사용자 파일 간에 데이터에 대한 전체 대량 복사를 실행합니다.
구문
RETCODE bcp_exec (
HDBC hdbc,
LPDBINT pnRowsProcessed);
인수
hdbc
대량 복사가 가능한 ODBC 연결 핸들입니다.pnRowsProcessed
DBINT에 대한 포인터입니다. bcp_exec 함수는 성공적으로 복사된 행 수로 이 DBINT를 채웁니다. pnRowsProcessed가 NULL이면 bcp_exec에서 이 인수를 무시합니다.
반환 값
SUCCEED, SUCCEED_ASYNC 또는 FAIL. 모든 행이 복사되면 bcp_exec 함수가 SUCCEED를 반환합니다. 비동기 대량 복사 작업이 보류 중이면 bcp_exec가 SUCCEED_ASYNC를 반환합니다. 대량 복사가 완전히 실패하거나 오류를 생성하는 행 수가 bcp_control을 사용하여 BCPMAXERRS에 지정된 값에 도달하면 bcp_exec 함수가 FAIL을 반환합니다. BCPMAXERRS의 기본값은 10입니다. BCPMAXERRS 옵션은 데이터 파일에서 행을 읽는 동안 공급자가 발견하는 구문 오류의 수에만 영향을 주고 서버로 전송되는 행 수에는 영향을 주지 않습니다. 행에서 오류를 발견하면 서버에서 일괄 처리를 중단합니다. 성공적으로 복사된 행 수를 보려면 pnRowsProcessed 매개 변수를 확인하십시오.
주의
이 함수는 bcp_init의 eDirection 매개 변수 값에 따라 사용자 파일에서 데이터베이스 테이블로 또는 데이터베이스 테이블에서 사용자 파일로 데이터를 복사합니다.
bcp_exec를 호출하기 전에 올바른 사용자 파일 이름을 지정하여 bcp_init를 호출합니다. 실패하면 오류가 반환됩니다.
bcp_exec는 무한정 보류될 수 있는 유일한 대량 복사 함수입니다. 따라서 비동기 모드를 지원하는 유일한 대량 복사 함수입니다. 비동기 모드를 설정하려면 bcp_exec를 호출하기 전에 SQLSetConnectAttr을 사용하여 SQL_ATTR_ASYNC_ENABLE을 SQL_ASYNC_ENABLE_ON으로 설정합니다. 완료 테스트를 하려면 같은 매개 변수를 사용하여 bcp_exec를 호출합니다. 대량 복사가 완료되지 않은 경우 bcp_exec가 SUCCEED_ASYNC를 반환합니다. 또한 서버로 전송된 행 수에 대한 상태 개수를 pnRowsProcessed에 반환합니다. 서버로 전송된 행은 일괄 처리의 끝에 도달할 때까지 커밋되지 않습니다.
SQL Server 2005부터 도입된 대량 복사의 주요 변경 사항에 대한 자세한 내용은 대량 복사 작업 수행(ODBC)을 참조하십시오.
예
다음 예에서는 bcp_exec를 사용하는 방법을 보여 줍니다.
// Variables like henv not specified.
HDBC hdbc;
DBINT nRowsProcessed;
// Application initiation, get an ODBC environment handle, allocate the
// hdbc, and so on.
...
// Enable bulk copy prior to connecting on allocated hdbc.
SQLSetConnectAttr(hdbc, SQL_COPT_SS_BCP, (SQLPOINTER) SQL_BCP_ON,
SQL_IS_INTEGER);
// Connect to the data source, return on error.
if (!SQL_SUCCEEDED(SQLConnect(hdbc, _T("myDSN"), SQL_NTS,
_T("myUser"), SQL_NTS, _T("myPwd"), SQL_NTS)))
{
// Raise error and return.
return;
}
// Initialize bulk copy.
if (bcp_init(hdbc, _T("pubs..authors"), _T("authors.sav"), NULL, DB_OUT)
== FAIL)
{
// Raise error and return.
return;
}
// Now, execute the bulk copy.
if (bcp_exec(dbproc, &nRowsProcessed) == FAIL)
{
if (nRowsProcessed == -1)
{
printf_s("No rows processed on bulk copy execution.\n");
}
else
{
printf_s("Incomplete bulk copy. Only %ld row%s copied.\n",
nRowsProcessed, (nRowsProcessed == 1) ? "": "s");
}
return;
}
printf_s("%ld rows processed.\n", nRowsProcessed);
// Carry on.