bcp_moretext

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Stuurt een deel van een lange, variabele datatypewaarde naar SQL Server.

Syntax

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

Arguments

hdbc-
Is de ODBC-verbindingshandgreep waarvoor bulksgewijs kopiëren is ingeschakeld.

cbData
Is het aantal bytes data dat naar SQL Server wordt gekopieerd vanuit de data waarnaar pData verwijst. Een waarde van SQL_NULL_DATA duidt NULL aan.

pData-
Is een verwijzing naar het ondersteunde, lange, variabele data-chunk dat naar SQL Server wordt gestuurd.

Returns

SLAGEN OF MISLUKKEN.

Remarks

Deze functie kan samen met bcp_bind en bcp_sendrow worden gebruikt om lange, variabele datawaarden te kopiëren om in een aantal kleinere stukken te SQL Server. bcp_moretext kan worden gebruikt met kolommen die de volgende SQL Server datatypes hebben: text, ntext, image, varchar(max),nvarchar(max),varbinary(max), door de gebruiker gedefinieerd type (UDT) en XML. bcp_moretext geen dataconversies ondersteunt, moeten de geleverde gegevens overeenkomen met het datatype van de doelkolom.

Als bcp_bind wordt aangeroepen met een niet-NULL pData-parameter voor datatypes die door bcp_moretext worden ondersteund, stuurt bcp_sendrow de volledige datawaarde, ongeacht de lengte. Als bcp_bind echter een NULL pData-parameter heeft voor ondersteunde datatypes, kan bcp_moretext direct na een succesvolle terugkeer van bcp_sendrow worden gebruikt om data te kopiëren, wat aangeeft dat alle gebonden kolommen met aanwezige data zijn verwerkt.

Als je bcp_moretext gebruikt om één ondersteunde datatypekolom in een rij te sturen, moet je deze ook gebruiken om alle andere ondersteunde datatypekolommen in die rij te sturen. Er mogen geen kolommen worden overgeslagen. Ondersteunde datatypen zijn SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT en SQLXML. SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY en SQLVARBINARY vallen ook in deze categorie als de kolom respectievelijk een varchar(max), nvarchar(max) of varbinary(max) is.

Het aanroepen van bcp_bind of bcp_collen stelt de totale lengte van alle datadelen die naar de kolom SQL Server worden gekopieerd. Een poging om SQL Server meer bytes te sturen dan gespecificeerd in de aanroep naar bcp_bind of bcp_collen genereert een foutmelding. Deze fout zou bijvoorbeeld ontstaan in een applicatie die bcp_collen gebruikte om de lengte van beschikbare data voor een SQL Server tekstkolom in te stellen op 4500, en vervolgens bcp_moretext vijf keer aanriep terwijl bij elke aanroep werd aangegeven dat de databufferlengte 1000 bytes lang was.

Als een gekopieerde rij meer dan één lange, variabele kolom bevat, stuurt bcp_moretext eerst zijn gegevens naar de laagst genummerde kolom, gevolgd door de volgende laagste kolom met ordinaal nummer, enzovoort. Het correct instellen van de totale lengte van de verwachte data is belangrijk. Er is geen manier om, buiten de lengte-instelling, aan te geven dat alle gegevens voor een kolom door bulkkopie zijn ontvangen.

Wanneer var(max) -waarden naar de server worden gestuurd met bcp_sendrow en bcp_moretext, is het niet nodig om bcp_collen aan te roepen om de kolomlengte in te stellen. In plaats daarvan wordt de waarde alleen voor deze typen beëindigd door bcp_sendrow aan te roepen met een lengte van nul.

Een applicatie roept normaal gesproken bcp_sendrow en bcp_moretext binnen lussen om een aantal rijen data te verzenden. Hier is een overzicht van hoe je dit doet voor een tabel met twee tekstkolommen :

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

Dit voorbeeld laat zien hoe je bcp_moretext gebruikt met bcp_bind en 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.