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
, , ntext
image
, 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_sendrow
verwenden:
// 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.