为什么SQLConfigDataSource失败?

时间:2019-01-11 18:00:46

标签: ms-access odbc

我承担了将一些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_ADD_DSN替换ODBC_CONFIG_SYS_DSN并更改DSN名称,则调用将成功并创建一个新的数据源。

我必须指出:

1)我不知道为什么以前的开发人员调用了此函数(
   ODBC数据源可能已经实现了相同的效果
   管理员)。

2)我不知道确切的功能是什么    无论如何都要进行“更新”。正在更新什么,什么    是“关键”字段?

3)并不是所有的属性都相关。

4)关于该主题的Microsoft文档非常简洁。

1 个答案:

答案 0 :(得分:1)

  

有关该主题的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-DSNODBC_CONFIG_DSN一起使用,而不是ODBC_CONFIG_SYS_DSN

此外,我假设您的操作系统是x64,但应用程序是x86(32位),因此请记住,x86应用程序需要在%Windir%\SysWOW64\odbcad32.exe中配置的DSN,而不是在%Windir%\System32\odbcad32.exe中配置的DSN 。驱动程序的路径system32\odbcjt32.dll让我想到了这一点。