Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Отправляет часть длинного значения типа данных переменной длины в SQL Server.
Синтаксис
RETCODE bcp_moretext (
HDBC
hdbc
,
DBINT
cbData
,
LPCBYTE
pData
);
Аргументы
hdbc
Дескриптор соединения ODBC с поддержкой массового копирования.
cbData
Количество байтов данных, копируемых в SQL Server из данных, на которые ссылается pData. Значение SQL_NULL_DATA соответствует значению NULL.
Pdata
Указатель на поддерживаемый длинный фрагмент данных переменной длины для отправки в SQL Server.
Возвращаемое значение
SUCCEED или FAIL.
Комментарии
Эту функцию можно использовать в сочетании с bcp_bind и bcp_sendrow для копирования длинных значений данных переменной длины в SQL Server в несколько небольших блоков. bcp_moretext можно использовать со столбцами, имеющими следующие SQL Server типы данных: text
, ntext
, image
, varchar(max)
, nvarchar(max)
, varbinary(max)
определяемый пользователем тип (UDT) и XML. bcp_moretext не поддерживает преобразование данных, предоставленные данные должны соответствовать типу данных целевого столбца.
Если bcp_bind вызывается с параметром pData , отличным отNULL, для типов данных, поддерживаемых bcp_moretext, bcp_sendrow
отправляет все значение данных независимо от длины. Однако если bcp_bind имеет параметр pData NULL для поддерживаемых типов данных, bcp_moretext можно использовать для копирования данных сразу после успешного возврата, bcp_sendrow
указывающего, что все связанные столбцы с данными были обработаны.
Если для отправки одного столбца поддерживаемого типа данных в строке используется bcp_moretext , необходимо также использовать его для отправки всех остальных столбцов поддерживаемых типов данных в строке. Ни один столбец не может быть пропущен. Поддерживаемыми типами данных являются SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT и SQLXML. То же относится к типам данных SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY и SQLVARBINARY, если столбец имеет тип varchar(max), nvarchar(max) или varbinary(max) соответственно.
Вызов bcp_bind или bcp_collen задает общую длину всех частей данных, копируемых в SQL Server столбец. Попытка отправить SQL Server больше байт, чем указано в вызове bcp_bind или bcp_collen
вызывает ошибку. Эта ошибка может возникнуть, например, в приложении, которое устанавливало bcp_collen
длину доступных данных для столбца text
SQL Server 4500, а затем вызывало bcp_moretext пять раз, указывая при каждом вызове, что длина буфера данных составляет 1000 байт.
Если скопированная строка содержит более одного длинного столбца переменной длины, bcp_moretext сначала отправляет свои данные в столбец с наименьшей порядковой нумеровкой, затем следующий столбец с наименьшей порядковой нумеровкой и т. д. Необходимо правильно задать длину ожидаемых данных. Какой-либо иной способ определения того, что в операции массового копирования получены все данные столбца, кроме проверки по заданной длине, отсутствует.
При var(max)
отправке значений на сервер с помощью bcp_sendrow и bcp_moretext нет необходимости вызывать bcp_collen, чтобы задать длину столбца. Вместо этого только для этих типов значение завершается вызовом bcp_sendrow с нулевой длиной.
Приложение обычно вызывает bcp_sendrow
и bcp_moretext в циклах для отправки ряда строк данных. Ниже описано, как это сделать для таблицы, содержащей два text
столбца:
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);
}
Пример
В этом примере показано, как использовать bcp_moretext с bcp_bind и 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.