1

场景:我们的安装包用于添加用户 DSN。由于终端服务器和 Citrix,我们将其更改为安装系统 DSN。

问题是这些旧的用户 DSN 中的一些是浮动的,我们的应用程序会在系统之前自动选择用户,并且随着我们升级服务器软件而连接信息发生了变化。

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

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

谢谢,卡尔文

4

3 回答 3

3

有关用户 DSN 的信息存储在注册表中。您是否考虑过简单地进行几次注册表读取,然后删除/重命名无效的 DSN,或者警告用户有关冲突并为用户提供修复问题的选项?

于 2009-02-14T00:09:05.163 回答
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

布雷克

于 2009-03-14T08:46:11.500 回答
1

Since you're using SQL Anywhere, take a look at the dbdsn utility that comes with it. It will allow you to list, describe, create, and delete both user and system DSNs. You can use it, for example, to see if user and system DSNs both exist and delete the one you don't want.

于 2009-08-12T18:57:17.697 回答