我承担了将一些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文档非常简洁。
答案 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-DSN
与ODBC_CONFIG_DSN
一起使用,而不是ODBC_CONFIG_SYS_DSN
。
此外,我假设您的操作系统是x64,但应用程序是x86(32位),因此请记住,x86应用程序需要在%Windir%\SysWOW64\odbcad32.exe
中配置的DSN,而不是在%Windir%\System32\odbcad32.exe
中配置的DSN 。驱动程序的路径system32\odbcjt32.dll
让我想到了这一点。