用户DSN&系统DSN - 如何选择系统?

时间:2009-02-13 23:17:50

标签: odbc powerbuilder sqlanywhere dsn

方案: 我们的安装包用于添加用户DSN。由于终端服务器和Citrix,我们对此进行了更改以安装系统DSN。

问题是这些旧的用户DSN中的一些是浮动的,我们的应用程序在系统之前自动选择用户,并且在我们升级服务器软件时连接信息已经改变。

我想我的问题是,如果存在重复项,是否有办法强制应用程序在用户DSN上使用系统DSN?

我们的应用程序是用PowerBuilder 10.5编写的,我们使用SQL Anywhere 10.0.1。

谢谢, 卡尔文

3 个答案:

答案 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。