2010-11-18 4 views
0

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

Connection попытка так:

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, с которым я работаю?

Per предложения 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 соединять метод.

+1

В вашем примере отсутствуют аргументы имени пользователя и пароля, поэтому ваш хэш-атрибут атрибутов DBI будет отображаться как имя пользователя. Просто потому, что вы помещаете UID/PWD в строку соединения, не означает, что вы можете опустить 2-й и 3-й аргументы DBI. – bohica

+0

Выполнение этого изменения дает ожидаемые результаты, сообщение об ошибке подавляется. – Bryan

ответ

3

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

+0

Спасибо, PrintError установлен в 0. Также установите PrintWarn в 0 и без изменений. RaiseError установлен в 1, но когда соединение терпит неудачу, и я проверяю $ @ вне блока eval, он не определен. – Bryan

+0

perl -le 'использовать DBI; мой $ dbh; eval {$ dbh = DBI-> connect ("dbi: ODBC: baugi", "sa", "неправильный пароль", {PrintError => 0, PrintWarn => 0, RaiseError => 1});}; print "Ошибка: $ @ \ n"; Ошибка DBI connect ('baugi', 'sa', ...) не удалось: [unixODBC] [Easysoft] [Драйвер SQL Server] [SQL Server] Ошибка входа для пользователя 's'. (SQL-28000) на -e строке 1 – bohica

0

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

+0

Правильно, это было правильно в моем коде, но не в сообщении. Благодаря! – Bryan

 Смежные вопросы

  • Нет связанных вопросов^_^