Я в настоящее время использую драйвер Phoenix ODBC. Я могу получить доступ к Фениксу только с определенным пользователем. Когда я использую SQLDriverConnect с обоими пользователями, это работает. Но если я вызываю ImpersonateLoggedOnUser, то SQLDriverConnect не может найти DSN. Это дает мне следующую ошибку.
[Microsoft] [ODBC Driver Manager] Не найдено имя источника данных и не указан драйвер по умолчанию.Код — это что-то вроде следующего. Не могли бы вы мне помочь, пожалуйста.
//login with user
DWORD dwSize;
HANDLE hToken;
LPVOID lpvEnv;
PROCESS_INFORMATION pi = {0};
STARTUPINFO si = {0};
WCHAR szUserProfile[256] = L"";TCHAR * tstrUserName = L"USERNAME" ;
TCHAR * tstrPassword = L"PASSWORD" ;
si.cb = sizeof(STARTUPINFO);
if (!LogonUser(
tstrUserName,
NULL,
tstrPassword,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hToken
)
)
{
auto value = GetLastError();
throw "Cannot Login With ANOTHER USER";
}
ImpersonateLoggedOnUser(hToken);
w_char *connectionString = L"DSN=Phoenix";
SQL_ENVIRONMENT env;
SQL_DBC_HANDLE dbcHandle;if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env) == SQL_ERROR)
{
throw;
}
// Register this as an application that expects 3.x behavior,
// you must register something if you use AllocHandle
SQLSetEnvAttr(env,
SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3,
0);
//allocate a connection
RETCODE ret = 0;
ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbcHandle);
if(ret == SQL_ERROR || dbcHandle == nullptr )
throw;
//connect with driver to odbc
ret = SQLDriverConnect( dbcHandle,
nullptr,
connectionString,
SQL_NTS,
nullptr,
0,
nullptr,
SQL_DRIVER_NOPROMPT
);
Ваш код все выглядит разумно. Однако сначала проверьте простые вещи, когда вы создали источник данных в odbc …
Других решений пока нет …