Freigeben über


bcp_moretext

Sendet einen Teil eines langen Datentypwerts variabler Länge an SQL Server.

Syntax

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

Argumente

hdbc
Das für den Massenkopiervorgang aktivierte ODBC-Verbindungshandle.

cbData-
Ist die Anzahl der Bytes, die aus den daten, auf die von pData verwiesen wird, in SQL Server kopiert werden. Ein Wert von SQL_NULL_DATA gibt NULL an.

pData
Ist ein Zeiger auf den unterstützten, langen datenabschnitt mit variabler Länge, der an SQL Server gesendet werden soll.

Rückkehr

SUCCEED oder FAIL.

Bemerkungen

Diese Funktion kann in Verbindung mit bcp_bind und bcp_sendrow verwendet werden, um lange Datenwerte mit variabler Länge in SQL Server in einer Reihe kleinerer Blöcke zu kopieren. bcp_moretext können mit Spalten mit den folgenden SQL Server-Datentypen verwendet werden: text, , ntext, , image, varchar(max)nvarchar(max), varbinary(max)benutzerdefinierter Typ (UDT) und XML. bcp_moretext keine Datenkonvertierungen unterstützt, müssen die bereitgestellten Daten mit dem Datentyp der Zielspalte übereinstimmen.

Wenn bcp_bind mit einem nichtNULL pData-Parameter für Datentypen aufgerufen wird, die von bcp_moretext unterstützt werden, bcp_sendrow sendet den gesamten Datenwert unabhängig von der Länge. Wenn bcp_bind jedoch über einen NULL-pData-Parameter für unterstützte Datentypen verfügt, können bcp_moretext verwendet werden, um Daten unmittelbar nach einer erfolgreichen Rückgabe zu kopieren, die bcp_sendrow angibt, dass alle gebundenen Spalten mit vorhandenen Daten verarbeitet wurden.

Wenn Sie bcp_moretext verwenden, um eine unterstützte Datentypspalte in einer Zeile zu senden, müssen Sie sie auch verwenden, um alle anderen unterstützten Datentypspalten in der Zeile zu senden. Möglicherweise werden keine Spalten übersprungen. Unterstützte Datentypen sind SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT und SQLXML. SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY und SQLVARBINARY fallen ebenfalls in diese Kategorie, wenn die Spalte eine varchar(max), nvarchar(max) oder varbinary(max) ist.

Durch Aufrufen von bcp_bind oder bcp_collen wird die Gesamtlänge aller Datenteile festgelegt, die in die SQL Server-Spalte kopiert werden sollen. Ein Versuch, SQL Server mehr Bytes zu senden als im Aufruf von bcp_bind angegeben oder bcp_collen generiert einen Fehler. Dieser Fehler würde z. B. in einer Anwendung auftreten, die verwendet bcp_collen wurde, um die Länge der verfügbaren Daten für eine SQL Server-Spalte text auf 4500 festzulegen, dann bcp_moretext fünf Mal aufgerufen, während bei jedem Aufruf angegeben wird, dass die Länge des Datenpuffers 1000 Bytes lang war.

Wenn eine kopierte Zeile mehr als eine lange Spalte mit variabler Länge enthält, sendet bcp_moretext zuerst die Daten an die niedrigste oder standardmäßig nummerierte Spalte, gefolgt von der nächsten niedrigsten ordnungsmäßig nummerierten Spalte usw. Die richtige Einstellung der Gesamtlänge der erwarteten Daten ist wichtig. Es gibt keine Möglichkeit, außerhalb der Längeneinstellung zu signalisieren, dass alle Daten für eine Spalte durch Massenkopie empfangen wurden.

Wenn var(max) Werte mithilfe von bcp_sendrow und bcp_moretext an den Server gesendet werden, ist es nicht erforderlich, bcp_collen aufzurufen, um die Spaltenlänge festzulegen. Stattdessen wird der Wert nur für diese Typen beendet, indem bcp_sendrow mit einer Länge von Null aufgerufen wird.

Eine Anwendung ruft normalerweise innerhalb von Schleifen auf bcp_sendrow und bcp_moretext , um eine Reihe von Datenzeilen zu senden. Im Folgenden finden Sie eine Gliederung dazu für eine Tabelle mit zwei text Spalten:

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

Beispiel

In diesem Beispiel wird gezeigt, wie sie bcp_moretext mit bcp_bindbcp_sendrowund :

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

Siehe auch

Massenkopierfunktionen