Сбой bcp_bind при использовании с размером более 8000 байт для столбца VARBINARY (MAX)

Я использую функции массового копирования (http://msdn.microsoft.com/en-us/library/ms130922.aspx) через собственный клиент SQL Server v11 для быстрой вставки данных в таблицу SQL Server 2012. Все работает нормально, кроме вставки больших (более 8 КБ) блоков данных в столбец BLOB (вставка данных под 8 КБ работает без проблем). Я получаю следующую расширенную информацию об ошибке:

HY000 «Неверный размер поля для типа данных»

Пример кода C ++:

std::vector<char> vData(9000, 0);
BYTE* pData = &buf[0];
DBINT nLenth = buf.size();
auto nRet = bcp_bind(hHandle, pData, 0, nLength, nullptr, 0, SQLVARBINARY, 2/*Column number is  correct*/);
assert(nRet != FAIL); //Fails

SQL для создания таблицы:

CREATE TABLE [Table1] (C1 INT IDENTITY (1,1) NOT NULL, C2 VARBINARY(MAX) NULL);

Я пробовал другой тип данных valus (SQLBIGBINARY, SQLBIGVARBINARY, SQLBINARY,…) — та же ошибка.

Я пробовал настройку pData в nullptr сигнализировать, что данные будут предоставлены через звонки bcp_moretext та же ошибка.

Привязка блока данных под 8К работает без проблем.

Передача тех же данных через ODBC SQLBindParameter с типом SQL_VARBINARY (SQL_C_BINARY) работает без проблем.

Есть ли шанс получить функциональность массового копирования?

Спасибо!

1

Решение

Отвечая на мой собственный вопрос:

даже если bcp_bind по какой-то странной причине происходит сбой при привязке к столбцам размером более 8 Кбайт, другой функции BCP, bcp_collen, отлично работает с теми же данными. Итак, код решения:

std::vector<char> vData(9000, 0);
BYTE* pData = &buf[0];
DBINT nLenth = buf.size();
auto nRet = bcp_bind(hHandle, pData, 0, 1/*or any value < 8000*/, nullptr, 0, SQLVARBINARY, 2/*Column number*/);
assert(nRet != FAIL); //OK
nRet = bcp_collen(hHandle, nLength, 2/*Column number*/);
assert(nRet != FAIL); //OK

работает как шарм!

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector