Ошибка 80040e21 и DBBINDSTATUS_BADBINDINFO во время связывания после переключения с SQLOLEDB на SQLNCLI или поставщика MSOLEDBSQL - PullRequest
0 голосов
/ 01 мая 2018

Я работаю над некоторым устаревшим кодом C ++, который использует OLE DB для подключения к базе данных SQL Server. Мне нужно перейти от старого поставщика SQLOLEDB к более современному (SQLNCLI, SQLNCLI10, SQLNCLI11 или MSOLEDBSQL). Предположительно, это может быть возможно путем простой смены провайдера, но я сталкиваюсь с ошибкой 80040e21 («Многоэтапные ошибки при создании OLE DB»), когда я переключаюсь на любого из более новых провайдеров (точно такая же ошибка со всеми четырьмя перечисленные провайдеры). Это выгодно при вызове Bind после добавления записей связывания для всех столбцов. Если немного покопаться, то ошибка появляется, когда Bind вызывает IAccessor :: CreateAccessor, а один из столбцов возвращает состояние плохого связывания (DBBINDSTATUS_BADBINDINFO). Рассматриваемый столбец - VARCHAR (15), а другой столбец в моей тестовой таблице (INTEGER) не показывает состояние плохого связывания. Тип DB для столбца - DBTYPE_STR, и для буфера выделено 24 байта (16 для данных, 4 для длины и 4 для статуса).

Единственная найденная мною документация, связанная с DBBINDSTATUS_BADBINDINFO, находится по адресу https://msdn.microsoft.com/en-us/library/ms720969.aspx,, и ни одна из возможных причин, обсуждаемых там, не применима к моему делу. Все работает нормально (с точно такой же таблицей и параметрами), когда я переключаю провайдера обратно на SQLOLEDB, поэтому что-то должно было измениться в провайдерах SQLNCLI (а также в новом провайдере MSOLEDBSQL). У кого-нибудь есть идеи о том, что могло бы измениться в новых провайдерах, чтобы вызвать это (и что я мог бы сделать, чтобы устранить ошибку)?

...