Freigeben über


bcp_moretext

Sendet einen Teil eines langen Datentypwerts mit 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
Entspricht der Anzahl der Datenbytes, die aus den Daten, auf die pDataverweist, auf den SQL Server kopiert werden. Der Wert SQL_NULL_DATA gibt NULL an.

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

Gibt zurück

SUCCEED oder FAIL.

Bemerkungen

Diese Funktion kann zusammen mit bcp_bind und bcp_sendrow verwendet werden, um lange Datenwerte mit variabler Länge in mehreren kleineren Blöcken nach SQL Server zu kopieren. bcp_moretext können mit Spalten verwendet werden, die die folgenden SQL Server Datentypen aufweisen: text, , ntextimage, varchar(max), nvarchar(max), varbinary(max), benutzerdefinierter Typ (UDT) und XML. bcp_moretext unterstützt keine Datenkonvertierungen. Die angegebenen Daten müssen mit dem Datentyp der Zielspalte übereinstimmen.

Wenn bcp_bind mit einem nonNULL 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 sofort nach einer erfolgreichen Rückgabe von bcp_sendrow zu kopieren, wodurch angegeben wird, 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 alle anderen unterstützten Datentypspalten in der Zeile ebenfalls mit diesem Parameter senden. Es dürfen keine Spalten übersprungen werden. Unterstützte Datentypen sind SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT und SQLXML. SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY und SQLVARBINARY gehören auch zu dieser Kategorie, wenn die Spalte den Datentyp varchar(max), nvarchar(max) bzw. varbinary(max) aufweist.

Durch Aufrufen von bcp_bind oder bcp_collen wird festgelegt, dass die gesamte Länge aller Datenausschnitte in die SQL Server-Spalte kopiert wird. Ein Versuch, SQL Server mehr Bytes als im Aufruf von bcp_bind angegeben zu senden, oder bcp_collen generiert einen Fehler. Dieser Fehler tritt beispielsweise in einer Anwendung auf, die verwendet wurdebcp_collen, um die Länge der verfügbaren Daten für eine SQL Server text Spalte auf 4500 festzulegen, und dann bcp_moretext fünfMal aufgerufen wurde, während bei jedem Aufruf angegeben wurde, dass die Datenpufferlänge 1000 Bytes lang war.

Wenn eine kopierte Zeile mehr als eine lange Spalte variabler Länge enthält, sendet bcp_moretext die Daten zunächst an die Spalte mit der niedrigsten Ordnungszahl, dann an die Spalte mit der zweitniedrigsten Ordnungszahl usw. Die richtige Einstellung der gesamten Länge der erwarteten Daten ist wichtig. Es gibt außer der Längeneinstellung keine Möglichkeit zu signalisieren, dass alle Daten für eine Spalte durch Massenkopieren empfangen wurden.

Wenn var(max) Werte mit 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 der Länge 0 von 0 aufgerufen wird.

Eine Anwendung ruft normalerweise in bcp_sendrow Schleifen auf und bcp_moretext , um eine Reihe von Datenzeilen zu senden. Hier sehen Sie, wie Sie dies für eine Tabelle mit zwei text Spalten tun:

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_bind und bcp_sendrowverwenden:

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

Weitere Informationen

Bulk Copy Functions