bcp_moretext

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Wysyła część długiej, zmiennej długości wartości typu danych do SQL Server.

Syntax

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

Arguments

hdbc
Czy obsługa połączenia ODBC z obsługą kopiowania zbiorczego.

cbData
To liczba bajtów danych kopiowanych do SQL Server z danych cytowanych przez pData. Wartość SQL_NULL_DATA oznacza NULL.

pData
Jest wskaźnikiem do wspieranego, długiego, zmiennie długiego fragmentu danych, który ma zostać wysłany do SQL Server.

Zwroty

POWODZENIE lub NIEPOWODZENIE.

Remarks

Funkcję tę można stosować razem z bcp_bind i bcp_sendrow do kopiowania długich, zmiennie długich wartości danych do SQL Server w kilku mniejszych częściach. bcp_moretext można używać z kolumnami zawierającymi następujące SQL Server typy danych: tekst, ntext, image, varchar(max),nvarchar(max),varbinary(max), typ zdefiniowany przez użytkownika (UDT) oraz XML. bcp_moretext nie obsługuje konwersji danych, dostarczone dane muszą odpowiadać typowi danych kolumny docelowej.

Jeśli bcp_bind jest wywoływany z parametrem pData nie-NULL dla typów danych obsługiwanych przez bcp_moretext, bcp_sendrow wysyła całą wartość danych, niezależnie od długości. Jeśli jednak bcp_bind posiada parametr NULL pData dla obsługiwanych typów danych, można bcp_moretext użyć do kopiowania danych bezpośrednio po pomyślnym powrocie z bcp_sendrow wskazując, że wszystkie powiązane kolumny z danymi zostały przetworzone.

Jeśli używasz bcp_moretext do wysyłania jednej kolumny obsługiwanego typu danych w wierszu, musisz także użyć go do przesłania wszystkich pozostałych kolumn obsługiwanych typów danych w wierszu. Nie wolno pomijać kolumn. Obsługiwane typy danych to SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT oraz SQLXML. SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY i SQLVARBINARY również należą do tej kategorii, jeśli kolumną są odpowiednio varchar(max), nvarchar(max) lub varbinary(max).

Wywołanie bcp_bind lub bcp_collen ustala całkowitą długość wszystkich części danych do kolumny SQL Server. Próba wysłania SQL Server większej liczby bajtów niż wskazano w wywołaniu do bcp_bind lub bcp_collen powoduje błąd. Błąd ten pojawiał się na przykład w aplikacji, która używała bcp_collen do ustawiania długości dostępnych danych dla kolumny tekstowej SQL Server na 4500, a następnie wywoływała bcp_moretext pięć razy, wskazując przy każdym wywołaniu, że długość bufora danych wynosi 1000 bajtów.

Jeśli skopiowany wiersz zawiera więcej niż jedną długą, zmienną długość kolumny, bcp_moretext najpierw wysyła swoje dane do najniższej kolumny o numerze zwyczajowej, następnie do następnej najniższej kolumny o numerze zwyczajowej i tak dalej. Poprawne ustawienie całkowitej długości oczekiwanych danych jest ważne. Nie ma sposobu, by poza ustawieniem długości zasygnalizować, że wszystkie dane dla kolumny zostały odebrane przez kopię masową.

Gdy wartości var(max) są wysyłane do serwera za pomocą bcp_sendrow i bcp_moretext, nie jest konieczne wywoływanie bcp_collen, aby ustawić długość kolumny. Zamiast tego, tylko dla tych typów, wartość kończy się wywołaniem bcp_sendrow o długości zera.

Aplikacja zazwyczaj wywołuje pętle bcp_sendrow i bcp_moretext wewnątrz, aby przesłać określoną liczbę wierszy danych. Oto zarys, jak to zrobić dla tabeli zawierającej dwie kolumny tekstowe :

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);  
  
}  
  

Example

Ten przykład pokazuje, jak używać bcp_moretext z bcp_bind i 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.