Почему сбой SQLConfigDataSource? - PullRequest
0 голосов
/ 11 января 2019

Мне было поручено перенести некоторый код C ++ в Win 10, который был написан более 10 лет назад, а первоначальный разработчик недоступен.

Его код звонит на

SQLConfigDataSource(NULL, ODBC_CONFIG_SYS_DSN, _T("Microsoft Access Driver (*.mdb)"), cfgs); 

где cfgs это что-то вроде

const char *cfgs= 
"DSN=ExportBase\0"
"Drv=c:\\winnt\\system32\\odbcjt32.dll\0"
"DBQ=c:\\export\\exportbase.mdb\0"
"DriverId=25\0"
"FIL=MS Access;\0"
"PWD=password1\0"
"UID=Admin\0"
"SafeTrans=0\0\0";

Проблема в том, что этот вызов не завершается успешно, и вызов SQLInstallerError для получения сообщения возвращает строку типа

сбой ConfigDSN, ConfigDriver или ConfigTranslator драйвера.

(собственно, я перевожу это сообщение с французского оригинала).

Я попытался упростить строку cfgs до минимума:

"DSN=Database2\0UiD=Admin\0PWD=pWD\0DBQ=D:\\devt\\CPP\\MFC\\ODBCTest1\\Database2.mdb\0Drv=c:\\winnt\\system32\\odbcjt32.dll\0\0";

но даже тогда вызов не удался. Однако если я заменим ODBC_CONFIG_SYS_DSN на ODBC_ADD_DSN и изменим имя DSN, вызов будет успешным и создаст новый источник данных.

Я должен указать, что:

1) Я не знаю, почему предыдущий разработчик вызывал эту функцию (
тот же эффект, вероятно, можно было бы сделать с источником данных ODBC
Администратор).

2) Я не знаю точно, что это за функция делать в случае «обновления» в любом случае. Что обновляется, что такое ключевые поля?

3) Не очевидно, что все атрибуты в любом случае актуальны.

4) Документ Microsoft по этому вопросу очень краткий.

1 Ответ

0 голосов
/ 13 января 2019

Документ Microsoft по этому вопросу очень краткий.

Если я читаю sql / odbc / reference / syntax / sqlconfigdatasource-function Я вижу, что он конфигурирует / создает System-DSN, если он содержит _SYS_, как в ODBC_CONFIG_SYS_DSN, но User_DSN без _SYS_ как ODBC_ADD_DSN.

Это приложение было написано для Windows XP, где обычно пользователи имели права администратора и могли конфигурировать / добавлять System-DSN. В настоящее время пользователи и их приложения работают с ограниченными правами, что приводит к сбою приложения. Начните с прав администратора для настройки System-DSN или используйте User-DSN с ODBC_CONFIG_DSN вместо ODBC_CONFIG_SYS_DSN.

Кроме того, я предполагаю, что ваша ОС - x64, а приложение - x86 (32-битная версия), поэтому имейте в виду, что для приложения x86 требуется DSN, настроенный в %Windir%\SysWOW64\odbcad32.exe, а не в %Windir%\System32\odbcad32.exe. Путь к водителю system32\odbcjt32.dll напомнил мне об этом.

...