Пользователь DSN & System DSN - Как выбрать Систему? - PullRequest
1 голос
/ 14 февраля 2009

Сценарий: Наш установочный пакет используется для добавления пользовательского DSN. Мы изменили это, чтобы установить системные уведомления о доставке из-за терминальных серверов и Citrix.

Проблема заключается в том, что некоторые из этих старых пользовательских уведомлений о доставке перемещаются, и наше приложение автоматически выбирает пользователя до того, как система и информация о подключении изменились при обновлении серверного программного обеспечения.

Полагаю, мой вопрос в том, существует ли способ заставить приложение использовать системный DSN вместо пользовательского DSN, если существуют дубликаты?

Наше приложение написано в PowerBuilder 10.5, и мы используем SQL Anywhere 10.0.1.

Спасибо, Calvin

Ответы [ 3 ]

3 голосов
/ 14 февраля 2009

Информация о пользователях DSN хранится в реестре. Рассматривали ли вы просто выполнение нескольких операций чтения реестра из реестра, а затем либо удаление / переименование недействительного уведомления о доставке, либо предупреждение пользователя о конфликте и предоставление пользователю возможности исправить проблему?

2 голосов
/ 14 марта 2009

См. RegistryValues ​​() в справке PowerBuilder. Следующее не совсем то, что вы хотите, но оно показывает пару рабочих вызовов ...

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

Брек

1 голос
/ 12 августа 2009

Поскольку вы используете SQL Anywhere, взгляните на прилагаемую утилиту dbdsn. Это позволит вам перечислять, описывать, создавать и удалять как пользовательские, так и системные DSN. Вы можете использовать его, например, чтобы увидеть, существуют ли пользовательские и системные DSN, и удалить тот, который вам не нужен.

...