Нарушение прав доступа при закрытии последнего соединения ODB C (только для Win64) - PullRequest
1 голос
/ 18 февраля 2020

Я безуспешно пытаюсь решить проблему, связанную с несколькими (двумя или более) соединениями ODB C с драйвером Microsoft Access на Windows x64 (оба Windows 10 и 7). В частности, когда закрывается последнее соединение (второе в примере), происходит нарушение прав доступа (в модуле Mso30win32client.dll). Эта проблема не появляется, если код построен для цели x86 (win32). Я пробовал разные компиляторы (C ++ Builder 10.2, Visual C 2019, MingW64 4.5.3) без успеха. Я использую драйвер MS Access ODB C, установленный вместе с Office 2016 (установлены все обновления), чья версия 16.00.4951.1000 (ACEODB C .DLL). Если я изменяю источник данных с помощью нескольких подключений с драйвером MySQL, код отлично работает как для 32-, так и для 64-разрядных целей.
Вот код:

#include <windows.h>
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>

#ifdef _WIN64
const TCHAR * DsnSource1 = TEXT("Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
                                "Dbq=..\\..\\Ligands.mdb");

const TCHAR * DsnSource2 = TEXT("Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
                                "Dbq=..\\..\\Pockets.mdb");
#else

const TCHAR * DsnSource1 = TEXT("Driver={Microsoft Access Driver (*.mdb)};"
                                "Dbq=..\\..\\Ligands.mdb");

const TCHAR * DsnSource2 = TEXT("Driver={Microsoft Access Driver (*.mdb)};"
                                "Dbq=..\\..\\Pockets.mdb");
#endif


int main(int argc, char *argv[])
{
  SQLRETURN         Res;
  HDBC              hDBC1, hDBC2;
  HENV              hEnv;

  Res = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
  Res = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);

  Res = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC1);
  Res = SQLDriverConnect(hDBC1, NULL, (SQLTCHAR *)DsnSource1, SQL_NTS,
                         NULL, 0, NULL, SQL_DRIVER_NOPROMPT);

  Res = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDBC2);
  Res = SQLDriverConnect(hDBC2, NULL, (SQLTCHAR *)DsnSource2, SQL_NTS,
                         NULL, 0, NULL, SQL_DRIVER_NOPROMPT);

  Res = SQLDisconnect(hDBC1);
  Res = SQLFreeHandle(SQL_HANDLE_DBC, hDBC1);

  Res = SQLDisconnect(hDBC2);  /* <- Access violation */
  Res = SQLFreeHandle(SQL_HANDLE_DBC, hDBC2);

  Res = SQLFreeHandle(SQL_HANDLE_ENV, hEnv);

 return 0;
}

Не знаю понять были проблемы. Любое предложение приветствуется и спасибо заранее.

1 Ответ

0 голосов
/ 20 февраля 2020

Мы испытываем ту же проблему здесь, используя именно эту версию драйвера и Win64. Теперь он работает при установке «Threads = 1» в строке подключения, то есть dsn будет:

const TCHAR * DsnSource1 = TEXT("Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
                                "Dbq=..\\..\\Ligands.mdb;Threads=1");
...