Compartilhar via


Mais texto de BCP

Envia parte de um valor de tipo de dados de comprimento variável longo para o SQL Server.

Sintaxe

  
RETCODE bcp_moretext (  
HDBC   
hdbc  
,  
DBINT   
cbData  
,  
LPCBYTE   
pData  
);  
  

Argumentos

hdbc
É o identificador de conexão ODBC habilitado para cópia em massa.

cbData
É o número de bytes de dados que estão sendo copiados para o SQL Server dos dados referenciados pelo pData. Um valor de SQL_NULL_DATA indica NULL.

pData
É um ponteiro para a parte de dados de comprimento variável com suporte a ser enviada ao SQL Server.

Devoluções

SUCCEED ou FAIL.

Observações

Essa função pode ser usada em conjunto com bcp_bind e bcp_sendrow para copiar valores de dados de comprimento variável longos para o SQL Server em várias partes menores. bcp_moretext pode ser usado com colunas que têm os seguintes tipos de dados do SQL Server: text, , ntext, image, varchar(max), nvarchar(max), varbinary(max), tipo definido pelo usuário (UDT) e XML. bcp_moretext não dá suporte a conversões de dados, os dados fornecidos devem corresponder ao tipo de dados da coluna de destino.

Se bcp_bind for chamado com um parâmetro pData nãoNULL para tipos de dados compatíveis com bcp_moretext, bcp_sendrow enviará todo o valor de dados, independentemente do comprimento. Se, no entanto, bcp_bind tiver um parâmetro nulo pData para tipos de dados com suporte, bcp_moretext poderá ser usado para copiar dados imediatamente após um retorno bem-sucedido indicando bcp_sendrow que todas as colunas associadas com dados presentes foram processadas.

Se você usar bcp_moretext para enviar uma coluna de tipo de dados com suporte em uma linha, também deverá usá-la para enviar todas as outras colunas de tipo de dados com suporte na linha. Nenhuma coluna pode ser ignorada. Os tipos de dados com suporte são SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT e SQLXML. SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY e SQLVARBINARY também se enquadram nessa categoria se a coluna for varchar(max), nvarchar(max) ou varbinary(max), respectivamente.

Chamar bcp_bind ou bcp_collen define o comprimento total de todas as partes de dados a serem copiadas para a coluna do SQL Server. Uma tentativa de enviar mais bytes do SQL Server do que o especificado na chamada para bcp_bind ou bcp_collen gera um erro. Esse erro surgiria, por exemplo, em um aplicativo que costumava bcp_collen definir o comprimento dos dados disponíveis para uma coluna do SQL Server text como 4500 e, em seguida, chamado bcp_moretext cinco vezes, indicando em cada chamada que o comprimento do buffer de dados tinha 1000 bytes de comprimento.

Se uma linha copiada contiver mais de uma coluna longa de comprimento variável, bcp_moretext primeiro enviará seus dados para a coluna com numeração ordinal mais baixa, seguida pela próxima coluna numerada ordinalmente mais baixa e assim por diante. A configuração correta do tamanho total dos dados esperados é importante. Não há como sinalizar, fora da configuração de comprimento, que todos os dados de uma coluna foram recebidos por cópia em massa.

Quando var(max) os valores são enviados para o servidor usando bcp_sendrow e bcp_moretext, não é necessário chamar bcp_collen para definir o comprimento da coluna. Em vez disso, somente para esses tipos, o valor é encerrado chamando bcp_sendrow com um comprimento igual a zero.

Um aplicativo normalmente chama bcp_sendrow e bcp_moretext em loops para enviar várias linhas de dados. Aqui está uma estrutura de tópicos de como fazer isso para uma tabela que contém duas text colunas:

while (there are still rows to send)  
{  
bcp_sendrow(...);  
  
for (all the data in the first varbinary(max) column)  
bcp_moretext(...);  
bcp_moretext(hdbc, 0, NULL);  
  
for (all the data in the second varbinary(max) column)  
bcp_moretext(...);  
bcp_moretext(hdbc, 0, NULL);  
  
}  
  

Exemplo

Este exemplo mostra como usar bcp_moretext com bcp_bind e bcp_sendrow:

// Variables like henv not specified.  
HDBC      hdbc;  
DBINT      idRow = 5;  
char*      pPart1 = "This text value isn't very long,";  
char*      pPart2 = " but it's broken into three parts";  
char*      pPart3 = " anyhow.";  
DBINT      cbAllParts;  
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, "comdb..articles", NULL, NULL, DB_IN) == FAIL)  
   {  
   // Raise error and return.  
   return;  
   }  
  
// Bind program variables to table columns.   
if (bcp_bind(hdbc, (LPCBYTE) &idRow, 0, SQL_VARLEN_DATA, NULL, 0,  
   SQLINT4, 1)    == FAIL)  
   {  
   // Raise error and return.  
   return;  
   }  
  
cbAllParts = (DBINT) (strnlen(pPart1, sizeof(pPart1) + 1) + strnlen(pPart2, sizeof(pPart2) + 1) + strnlen(pPart3, sizeof(pPart3) + 1));  
if (bcp_bind(hdbc, NULL, 0, cbAllParts, NULL, 0, SQLTEXT, 2) == FAIL)  
   {  
   // Raise error and return.  
   return;  
   }  
  
// Send this row, with the text value broken into three chunks.   
if (bcp_sendrow(hdbc) == FAIL)  
   {  
   // Raise error and return.  
   return;  
   }  
  
if (bcp_moretext(hdbc, (DBINT) strnlen(pPart1, sizeof(pPart1) + 1), pPart1) == FAIL)  
   {  
   // Raise error and return.  
   return;  
   }  
if (bcp_moretext(hdbc, (DBINT) strnlen(pPart2, sizeof(pPart2) + 1), pPart2) == FAIL)  
   {  
   // Raise error and return.  
   return;  
   }  
if (bcp_moretext(hdbc, (DBINT) strnlen(pPart3, sizeof(pPart3) + 1), pPart3) == FAIL)  
   {  
   // Raise error and return.  
   return;  
   }  
  
// All done. Get the number of rows processed (should be one).  
nRowsProcessed = bcp_done(hdbc);  
  
// Carry on.  

Consulte Também

Funções de cópia em massa