2010-11-18 4 views
0

テーブルからSQL Serverインスタンス名を取得するスクリプトを作成し、これらの各インスタンスに接続してデータベース構成情報を取り戻そうとします。関連するすべてのデータベースインスタンスは、SQL Serverの一部のバージョンです。接続が失敗した場合(パスワードが間違っている、インスタンスがダウンしているなど)、ユーザー定義のエラーメッセージ(「$ instに接続できません。スキップしています)」を印刷し、リストを続行します。 ODBC(SQL Serverネイティブクライアント10.0)からのデフォルトエラーメッセージを抑制するのに問題があります。DBIとDBDとの接続エラーを抑制する: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 connectメソッドが失敗した場合に死ぬために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 connectメソッドに別々のパラメータとして渡されました。

+1

DBI属性のハッシュリファレンスがユーザー名として表示されるように、例ではユーザー名とパスワードの引数がありません。接続文字列にUID/PWDを置いただけであっても、DBIの2番目と3番目の引数を省略することはできません。 – bohica

+0

この変更により予期した結果が得られた場合、エラーメッセージは表示されません。 – Bryan

答えて

3

Pedroが言及している問題を解決すると仮定すると、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"、 "wrongpassword"、{PrintError => 0、PrintWarn => 0、RaiseError => 1});}; print "エラーは$ @ \ n"; ' DBI接続( 'baugi'、 'sa'、...)に失敗しました:[unixODBC] [Easysoft] [SQL Server Driver] [SQL Server]ユーザー 'sa'のログインに失敗しました。 (SQL-28000)-e行1 – bohica

0

connectはクラスメソッドです。 DBI->connectと呼びます。これはdbハンドル(あなたの場合は$dbh)を返します。

+0

これは私のコードでは正しいが、投稿には正しくない。ありがとう! – Bryan

関連する問題