Sql server 如何将运行时mssql错误存储在变量中并继续在perl中运行?
我试图将运行时mssql错误存储在变量中,并继续处理所有其他数据Sql server 如何将运行时mssql错误存储在变量中并继续在perl中运行?,sql-server,perl,dbi,Sql Server,Perl,Dbi,我试图将运行时mssql错误存储在变量中,并继续处理所有其他数据 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->fetc
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块,但它也不起作用
我的程序如下(示例)
当我运行脚本时,它会显示
输出是
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.
即使三个
也不显示输出。仅显示一个
PrintErrorHandle属性告诉DBI调用Perl警告()
函数(通常会导致将错误打印到
遇到时显示屏幕)和RaiseError句柄属性(其中
告诉DBI在出现错误时调用Perl die()函数,通常是
导致脚本立即中止)。-
因此,您可以使用下面的方法来处理这种情况
local $SIG{__DIE__} = sub {
my ($die_message) = @_;
#do something..
};
我正在尝试将错误存储在变量中
在上述代码段中,$die_message
将包含错误消息
另一个选项是将
RaiseError
设置为0,将PrintError
设置为1,这样您可以得到警告
提示,但程序不会死亡
打印错误
PrintError属性可用于强制生成错误
除了在中返回错误代码之外,还提供警告(使用warn)
正常的方式。当设置为“开”时,任何导致错误的方法
发生此事件将导致DBI有效地执行warn($class$方法)
失败:$DBI::errstr“
其中$class
是驱动程序类,并且
$method
是失败的方法的名称
RaiseError
RaiseError属性可用于强制引发错误
异常而不是简单地以正常方式返回错误代码。信息技术
默认情况下为“关闭”。当设置为“on”时,任何导致
错误将导致DBI有效地执行die(“$class$method”)
失败:$DBI::errstr“
,其中$class
是驱动程序类,而
$method
是失败的方法的名称
来源-
您也可以通过以下方式手动执行此操作:
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
我从答案中得到了我问题的答案 最后的答案是
do
{
while(my @row=$sth->fetchrow_array())
{
if ($sth->errstr)
{
my $Error = $sth->errstr;
}
print $row[0]."\n\n";
}
} while ($sth->{odbc_more_results});
若要在过程本身中执行此操作,可以使用Try..Catch块执行异常处理。请参阅此处的文档
https://msdn.microsoft.com/en-us/library/ms175976.aspx
您想继续脚本,只捕获错误吗?@AbhiNickz是的,我想继续脚本。看看这个@AbhiNickz,我试过了,但没有成功。报告相同的错误。为什么不简单地从RaiseError
切换到PrintError
?@Chankeypathak如何防止dbi中止
?@mkHun正如dgw提到的那样,关闭RaiseError并启用PrintError将阻止中止。@Chankeypathak我一个问题一个问题地得到了答案。我也用了你的伎俩。谢谢你的帮助。
do
{
while(my @row=$sth->fetchrow_array())
{
if ($sth->errstr)
{
my $Error = $sth->errstr;
}
print $row[0]."\n\n";
}
} while ($sth->{odbc_more_results});