场景:我们的安装包用于添加用户DSN。由于终端服务器和Citrix的原因,我们将其更改为安装系统DSN。
问题是,一些旧用户DSN到处浮动,我们的应用程序在系统和连接信息随着我们升级服务器软件而发生变化之前自动选择用户。
我想我的问题是,如果存在重复项,有没有办法强制应用程序使用系统DSN而不是用户DSN?
我们的应用程序是用SQL10.5编写的,我们使用的是PowerBuilder Anywhere 10.0.1。
谢谢,卡尔文
发布于 2009-03-14 08:46:12
请参见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 IFBreck
发布于 2009-02-14 00:09:05
有关用户DSN的信息存储在注册表中。您是否考虑过简单地执行几次注册表读取,然后删除/重命名无效的DSN,或者就冲突向用户发出警告并让用户选择修复问题?
发布于 2009-08-12 18:57:18
由于您使用的是SQL Anywhere,因此请看一下随附的dbdsn实用程序。它将允许您列出、描述、创建和删除用户和系统DSN。例如,您可以使用它来查看用户和系统don是否同时存在,并删除不需要的don。
https://stackoverflow.com/questions/548067
复制相似问题