2010-11-18 6 views
0

테이블에서 SQL Server 인스턴스 이름을 가져 오는 스크립트를 작성한 다음 각 인스턴스에 연결하여 데이터베이스 구성 정보를 회수합니다. 관련된 모든 데이터베이스 인스턴스는 SQL Server의 일부 버전입니다. 연결이 실패한 경우 (암호가 잘못되어 인스턴스가 다운 된 경우 등) 사용자 정의 오류 메시지 ("$ inst에 연결할 수 없습니다. 건너 뜁니다.")를 인쇄하고 목록을 계속 진행합니다. ODBC (SQL Server Native Client 10.0)의 기본 오류 메시지를 표시하는 데 문제가 있습니다.DBI 및 DBD와의 연결 오류 방지 : ODBC SQL Server Native Client 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 드라이버의 결과입니까? 사용자 이름과 암호가 연결 문자열 밖으로 이동 및 연결 방법을 DBI 별도의 매개 변수로 전달 된

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 } 
); 
}; 

: 같은 bohica의 제안 당

은, 코드를 작업하는 모습.

+1

예제에서 사용자 이름/암호 인수가 누락되어 DBI 속성의 hashref가 사용자 이름으로 표시됩니다. 연결 문자열에 UID/PWD를 넣었 기 때문에 DBI의 두 번째 및 세 번째 인수를 생략 할 수있는 것은 아닙니다. – 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});}; 인쇄 "오류는 $ @ \ 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