方案: 我们的安装包用于添加用户DSN。由于终端服务器和Citrix,我们对此进行了更改以安装系统DSN。
问题是这些旧的用户DSN中的一些是浮动的,我们的应用程序在系统之前自动选择用户,并且在我们升级服务器软件时连接信息已经改变。
我想我的问题是,如果存在重复项,是否有办法强制应用程序在用户DSN上使用系统DSN?
我们的应用程序是用PowerBuilder 10.5编写的,我们使用SQL Anywhere 10.0.1。
谢谢, 卡尔文
答案 0 :(得分:3)
有关用户DSN的信息存储在注册表中。您是否考虑过简单地进行几次注册表读取,然后删除/重命名无效的DSN,或者警告用户有关冲突并让用户选择修复问题?
答案 1 :(得分:2)
请参阅PowerBuilder帮助中的RegistryValues()。以下不完全是你想要的,但确实显示了几个工作电话......
integer li_RC
string ls_odbc_ini[]
li_RC = RegistryValues ( &
"HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources", &
ls_odbc_ini )
IF li_RC <> 1 THEN
MessageBox ( 'Error', &
'RegistryValues failed in website.open' )
RETURN
END IF
MessageBox ( 'A user DSN...', ls_odbc_ini[1] )
li_RC = RegistryValues ( &
"HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\ODBC Data Sources", &
ls_odbc_ini )
IF li_RC <> 1 THEN
MessageBox ( 'Error', &
'RegistryValues failed in website.open' )
RETURN
END IF
MessageBox ( 'A system DSN...', ls_odbc_ini[1] )
另一个建议是从您想要的任何DSN读取连接信息,然后使用“无DSN”连接,以避免“选择错误的DSN”。
SQLCA.DBMS = 'ODB'
SQLCA.DBParm &
= "ConnectString='Driver=SQL Anywhere 10;" &
+ "UID=dba;PWD=sql;DatabaseName=ruralfinds_local;EngineName=ruralfinds_local'," &
+ "ConnectOption='SQL_DRIVER_CONNECT,SQL_DRIVER_NOPROMPT'"
CONNECT USING SQLCA;
IF SQLCA.SQLCODE <> 0 THEN
MessageBox ( 'Error', &
'CONNECT failed in open:' &
+ '~r~nSQLCode = ' &
+ String ( SQLCA.SQLCode ) &
+ '~r~nSQLDBCode = ' &
+ String ( SQLCA.SQLDBCode ) &
+ '~r~n' &
+ SQLCA.SQLErrText )
RETURN
END IF
Breck的
答案 2 :(得分:1)
由于您正在使用SQL Anywhere,请查看随附的dbdsn实用程序。它允许您列出,描述,创建和删除用户和系统DSN。例如,您可以使用它来查看用户和系统DSN是否都存在并删除您不想要的DSN。