Я работаю над некоторым устаревшим кодом 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). У кого-нибудь есть идеи о том, что могло бы измениться в новых провайдерах, чтобы вызвать это (и что я мог бы сделать, чтобы устранить ошибку)?
Задача ещё не решена.
Других решений пока нет …