2017-01-02 10 views
2

我試圖在變量中存儲運行時mssql錯誤並繼續使用所有其他數據。如何將運行時mssql錯誤存儲在變量中並繼續在perl中運行?

my $sth = $dbh->prepare("exec TEST_ABC_DB.dbo.testprocedure"); 
$sth->execute() ; 
my $db_error =$DBI::errstr; #It didn't work also I tried err and state 
print "\nDB error $db_error\n"; 
while (@row = $sth->fetchrow_array()) 
{ 
     print "Row: @row\n"; 
} 

我用eval塊,但它也不起作用。

我的如下方法,將(樣品)

CREATE procedure testprocedure as 
select 'one' 
select 'three' 
select 10/0 
select 'five' 

當我運行腳本它顯示

輸出是

Row: one 
DBD::ODBC::st finish failed: [unixODBC][FreeTDS][SQL Server]Divide by zero error encountered. (SQL-22012) at testing.pl line 24. 
DBI::db=HASH(0xbe79a0)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnecting) at testing.pl line 28. 

不顯示輸出甚至three。顯示唯一一個。

+0

如果你想這樣做的過程本身,你可以使用在try..catch塊做異常處理。在這裏查看文檔'https:// msdn.microsoft.com/en-us/library/ms175976.aspx' –

+0

您是否想繼續使用腳本並捕獲錯誤? – AbhiNickz

+0

@AbhiNickz是的,我想繼續劇本。 – mkHun

回答

2

的PrintError手柄屬性告訴DBI調用Perl的警告() 函數(當遇到這通常導致在被打印到 屏幕錯誤)和RAISEERROR手柄屬性( 告訴DBI調用Perl的die()函數出錯時,通常會導致腳本立即中止 )。 - Programming the Perl DBI

因此,您可以使用下面的處理情況。

local $SIG{__DIE__} = sub { 
    my ($die_message) = @_; 
    #do something.. 
}; 

我試圖存儲在變量

錯誤在上面的代碼中$die_message將包含錯誤信息。


另一種選擇是設置RaiseError爲0,PrintError爲1,這樣就得到warn英格斯,但程序不會die

PrintError

的PrintError屬性可用於強制的錯誤,以產生 警告(使用警告)除了在 正常的方式返回錯誤代碼。當設置爲「on」時,導致發生錯誤 的任何方法都將導致DBI有效地執行warn("$class $method failed: $DBI::errstr"),其中$class是驅動程序類,而 是失敗的方法的名稱。

RAISEERROR

的RAISEERROR屬性可以用來強制錯誤募集 例外,而不是簡單地以正常的方式返回錯誤代碼。它 默認爲「關閉」。當設置爲「on」時,導致出現 錯誤的任何方法都將導致DBI有效地執行die("$class $method failed: $DBI::errstr"),其中$class是驅動程序類,而 是失敗的方法的名稱。

來源 - DBI docs


你也可以手動完成由

my $dbh=DBI->connect(....{RaiseError=>1}) or die... 
my $sth=$dbh->prepare(...); 
{ 
    local $dbh->{RaiseError} = 0; 
    $sth->execute; 
    if ($sth->Errstr) { 
     # handle the error 
    } 
} 
# $dbh->{RaiseError} is back to normal here 
+0

爲什麼不簡單地從'RaiseError'切換到'PrintError'? – dgw

+0

@Chankeypathak如何防止dbi'abort'? – mkHun

+0

@mkHun由於dgw提到關閉RaiseError並啓用PrintError將防止中止。 –

0

我得到的答案從this回答我的問題。

最終的答案是

do 
{ 
while(my @row=$sth->fetchrow_array()) 
{ 
    if ($sth->errstr) 
    { 
     my $Error = $sth->errstr; 

    } 
    print $row[0]."\n\n"; 
} 
} while ($sth->{odbc_more_results}); 
相關問題