共用方式為


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 是唯一可能持續任何時間長度的大量複製函數。 因此,它是唯一支援非同步模式的大量複製函數。 若要設定非同步模式,請先使用 SQLSetConnectAttr,將 SQL_ATTR_ASYNC_ENABLE 設定為 SQL_ASYNC_ENABLE_ON,然後再呼叫 bcp_exec。 若要測試是否完成,請使用相同的參數來呼叫 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(hdbc, &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.

請參閱

參考

大量複製函數