bcp_exec

适用于:yesSQL Server (Azure) Azure SQL 数据库 YesYesSQL 托管实例 yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

执行数据库表和用户文件之间数据的完整大容量复制。

语法

  
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_exec 完全失败,或者生成错误的行数达到使用完全失败时为 BCPMAXERRS 指定的值,则返回 FAIL bcp_control。 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 ( (9.x) 开始大容量复制的中断性变更的信息,请参阅执行大容量复制操作 (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.  

另请参阅

大容量复制函数