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(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.

请参阅

参考

大容量复制函数