Подавление ошибки соединения с DBI и DBD: собственный клиент ODBC SQL Server 10.0 - PullRequest
0 голосов
/ 18 ноября 2010

Написание сценария для получения имен экземпляров SQL Server из таблицы, затем попытка подключиться к каждому из этих экземпляров для получения информации о конфигурации базы данных.Все задействованные экземпляры базы данных являются некоторой версией SQL Server.В случае сбоя соединения (из-за неверного пароля, экземпляра не работает и т. Д.) Необходимо напечатать пользовательское сообщение об ошибке («Невозможно подключиться к $ inst, пропуск.») И продолжить работу по списку.У меня проблемы с подавлением сообщения об ошибке по умолчанию из ODBC (собственный клиент SQL Server 10.0).

Попытка подключения выполняется следующим образом:

eval {
  my $dbh = DBI->connect(
    "dbi:ODBC:Driver={SQL Server Native Client 10.0};Server=<instance_name>;Uid=<user_name>;Pwd=<password>;",
    { PrintError => 0, RaiseError => 1, AutoCommit => 1 }
  );
};

Это мое (вероятно, неправильное) понимание того, чтоPrintError => 0 должно подавить сообщение об ошибке, а RaiseError => 1 приведет к смерти DBI в случае сбоя метода подключения, и в этот момент я могу проверить $ @ на наличие ошибки и распечатать пользовательское сообщение.Я также посмотрел на атрибут HandleError, но не добился успеха.

Это абсолютно нереалистичный сценарий или это результат работы драйвера ODBC, с которым я работаю?

Согласно предложениям bohica, рабочий код выглядит следующим образом:

eval {
  my $dbh = DBI->connect(
    "dbi:ODBC:Driver={SQL Server Native Client 10.0};Server=<instance_name>;",
    "Username",
    "Password",
    { PrintError => 0, RaiseError => 1, AutoCommit => 1 }
  );
};

Имя пользователя и пароль были удалены из строки подключения и переданы как отдельные параметры в метод подключения DBI.

Ответы [ 2 ]

3 голосов
/ 19 ноября 2010

Предполагая, что вы исправите проблему, о которой упоминает Педро, PrintError => 0 подавляет ошибки, и вы можете захотеть взглянуть и на PrintWarn.RaiseError => 1 приведет к тому, что соединение прекратит работу в случае сбоя соединения, и в вашем примере ошибка будет в $ @.

0 голосов
/ 19 ноября 2010

connect - метод класса; Вы вызываете его с помощью DBI->connect, который возвращает дескриптор дБ ($dbh в вашем случае).

...