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

0

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

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

Ive пробовал использовать другой тип данных valus (SQLBIGBINARY, SQLBIGVARBINARY, SQLBINARY ,...) - та же ошибка.

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

Блокировка блока данных под 8K работает без каких-либо проблем.

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

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

Спасибо!

Теги:
sql-server
odbc
bulk

1 ответ

0
Лучший ответ

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

даже если 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

работает как очарование!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню