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