Я использую функции массового копирования (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
) работает без проблем.
Есть ли шанс получить функциональность массового копирования?
Спасибо!
Отвечая на мой собственный вопрос:
даже если 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
работает как шарм!