Ошибка SQLDriverConnect, но sqlgetdiagre c возвращает sql_no_data - PullRequest
0 голосов
/ 14 февраля 2020

Я работаю над исправлением проблемы с драйвером ODB C. Вот мой пример кода

 SQLHENV henv;
  SQLHDBC hdbc;
  SQLRETURN retcode = ::SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

  retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
  retcode = ::SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
  retcode = ::SQLDriverConnect(hdbc, NULL, (SQLCHAR*)connectionString.c_str(),
    (SQLSMALLINT)connectionString.size(), NULL, 0, NULL, SQL_DRIVER_NOPROMPT);

  SQLCHAR sqlState[10];
  SQLINTEGER errorCode;
  SQLCHAR errorText[1024];
  SQLSMALLINT errorLen;

  if (::SQLGetDiagRec(SQL_HANDLE_DBC, hdbc, 1, sqlState, &errorCode, errorText,
    (SQLSMALLINT)1024, &errorLen) == SQL_NO_DATA_FOUND) {
    // return "Unknown Error";
  }

Я убедился, что тип дескриптора и дескриптор, которые я передал, являются дескриптором соединения с функцией SQLGetDiagRe c. Во время отладки я могу достичь точки останова в моем коде драйвера. Но странная вещь заключается в том, что после сбоя SQLDriverConnect точка останова не попадает во время SQLGetDiagRe c (из-за чего может быть, что функция драйвера не вызывается, вызывается функция менеджера драйверов) Поскольку дескриптор соединения Driver Manager не работает иметь любую диагностическую информацию, которая возвращает SQL_NO_DATA. Благодаря отладке я удостоверился, что дескриптор подключения драйвера имеет диагностическую информацию, так как после сбоя SQLDriverConnect SQLGetDiagRe c вызывается два раза автоматически, но как только управление достигает уровня приложения, SQLGetDiagRe c не достигает точки останова в коде драйвера и также возвращает SQL_NO_DATA.

Я знаю, что Driver Manager работает со своими собственными дескрипторами, пока не будет вызван SQLDriverConnect, после вызова SQLDriverConnect и вызова SQLAllocHandle для дескриптора env и conn, поэтому оба дескриптора будут выделены. Но, похоже, из-за сбоя соединения, выгрузки драйвера, что является причиной того, что SQLGetDiagRe c драйвера не вызывается. Что может быть причиной этого? Я обнаружил эту публикацию в стеке, но это не полезно для меня (ошибка SQLDriverConnect и отсутствие диагностики c вывод )

Примечание. При попытке выполнить SQLGetDiagRe c в том же примере кода с SQLExecDirect не удалось, удалось достичь точки останова в коде драйвера и получить информацию о диагностике. SQLGetDiagRe c в этом случае не вызывался два раза автоматически

...