IRowsetchAnge :: ошибка вставки dbstatus_e_cantconvertvalue только на строительстве x64C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 IRowsetchAnge :: ошибка вставки dbstatus_e_cantconvertvalue только на строительстве x64

Сообщение Anonymous »

Я создал функцию, которая вставляет данные в таблицу базы данных MSSQL 2022. Функция работает нормально, когда я строю его, используя релиз win32 \, но сбой, когда я использую x64 \ release. Я получил ошибку dbstatus_e_cantconvertvalue для первого столбца, который является строкой (varchar или nvarchar). Я попытался использовать оба, чтобы посмотреть, изменило ли это. Если я установите данные в NULL (DBStatus_S_ISNULL), он вставит запись с нулевым значением. < /P>
У меня установлена ​​текущая версия драйвера MSOLEDBSQL, а также самая последняя версия VC ++ REDISTIORB (оба поставленных версий x64 и 32. Большинство из них менее 128 символов, размер варчара составляет 2048. Скомпилирован как 32 -битное приложение Win, которое он работает идеально, и вставлен примерно в 50 тысячах строк. Соблюдается как x64, он терпит неудачу в каждой строке. < /P>
DBBindings[0].bPrecision = 0;
DBBindings[0].bScale = 0;
DBBindings[0].dwFlags = 0;
DBBindings[0].dwPart = DBPART_VALUE | DBPART_STATUS | DBPART_LENGTH;
DBBindings[0].eParamIO = DBPARAMIO_NOTPARAM;
DBBindings[0].iOrdinal = 1;
DBBindings[0].obLength = offsetof(DBTblStruct, m_length[0]);
DBBindings[0].obStatus = offsetof(DBTblStruct, m_status[0]);
DBBindings[0].pBindExt = NULL;
DBBindings[0].pObject = NULL;
DBBindings[0].pTypeInfo = NULL;
DBBindings[0].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
DBBindings[0].cbMaxLen = sizeof(dbRow.StringW);
DBBindings[0].obValue = offsetof(DBTblStruct, StringW);
DBBindings[0].wType = DBTYPE_WSTR;
ZeroMemory(&dbRow.StringW, sizeof(dbRow.StringW));
wcsncpy(dbRow.StringW, StringW, wcslen(StringW));
dbRow.m_status[0] = DBSTATUS_S_OK;

hr = pIRow->CreateAccessor(DBACCESSOR_ROWDATA, //dwAccessorFlags
1, //ULONG cBindings
DBBindings, //rgBindings[]
sizeof(DBTblStruct), //cbRowSize,
&hAccessor, //phAccessor
RowBindStatus ); //rgStatus[]
//Always returns S_OK - No errors
hr = spRowsetUpdate->InsertRow(DB_NULL_HCHAPTER, //hReserved
hAccessor, //hAccessor
&dbRow, //pData
phRow); //phRow
//Always returns 0x80040E21
//m_status[0] is set to DBSTATUS_E_CANTCONVERTVALUE
< /code>
Я попробовал оба ANSI (dbtype_str - varchar) и unicode (dbtype_wstr - nvarchar). Пробовал использовать только один символ в строке, и он не работает с dbstatus_e_cantconvertvalue. Тестовая таблица SQL с одним столбцом использовалась для исключения проблем с другими столбцами. Я использовал аналогичный код, скомпилированный для X64, но с Oracle. Это первое с использованием MSSQL 2022 с клиентом x64.

Подробнее здесь: https://stackoverflow.com/questions/796 ... x64-builds
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»