Sql server Perl执行DBI在循环中执行
我有一个perl脚本,它使用DBI接口准备一个带有参数1、2、3、4的语句。prepare语句执行一个带有4个参数的存储过程。然后它运行一个foreach循环并执行 如果参数不正确,存储过程将抛出错误并执行失败。我对打印警告并继续下一组参数感兴趣 在“无效参数”的第一次执行失败后,我在SQL execute中得到“尝试启动一个新的自适应服务器操作,结果挂起”作为errmsg,用于后续循环迭代Sql server Perl执行DBI在循环中执行,sql-server,perl,dbi,Sql Server,Perl,Dbi,我有一个perl脚本,它使用DBI接口准备一个带有参数1、2、3、4的语句。prepare语句执行一个带有4个参数的存储过程。然后它运行一个foreach循环并执行 如果参数不正确,存储过程将抛出错误并执行失败。我对打印警告并继续下一组参数感兴趣 在“无效参数”的第一次执行失败后,我在SQL execute中得到“尝试启动一个新的自适应服务器操作,结果挂起”作为errmsg,用于后续循环迭代 foreach my $file (@filelist) { #.. get param1 , p
foreach my $file (@filelist)
{
#.. get param1 , param2 , param3, param4 from $file
unless ( dbh->execute($param1,$param2,$param3,$param4) )
{
#print some warning
next;
}
}
如何继续处理此错误
这些是我正在使用的版本
>perl -MDBI -e 'DBI-> installed_versions;'
Perl : 5.010001 (x86_64-linux-thread-multi)
OS : linux (2.6.18-348.12.1.el5)
DBI : 1.609
DBD::Sybase : 1.15
DBD::Sponge : 12.010002
DBD::SQLite : 1.27
DBD::Proxy : install_driver(Proxy) failed: Can't locate RPC/PlClient.pm in @INC
DBD::Informix : 2013.0521
DBD::Gofer : 0.011565
DBD::File : 0.37
DBD::ExampleP : 12.010007
DBD::DBM : 0.03
我按照mekazu的建议在connect中添加了{RaiseError=>0,PrintWarn=>1,PrintError=>1}
(代码与您的mekazu完全相同),但这无助于获得相同的错误
每一次我都获得了成功,
迭代1无错误
迭代2给出了一个存储过程错误
“数据库执行失败。错误消息:服务器消息编号=52001
严重性=16状态=1行=124服务器=开发过程=sp1文本=数据
错误:无效参数:P1
迭代3
数据库执行失败。错误消息:OpenClient消息:层=
(0)来源=(0)严重性=(78)编号=(51)服务器开发,数据库
开发人员消息字符串:尝试启动新的自适应服务器
等待结果的操作
迭代4
数据库执行失败。错误消息:OpenClient消息:层=
(0)来源=(0)严重性=(78)编号=(51)服务器开发,数据库
开发人员消息字符串:尝试启动新的自适应服务器
等待结果的操作
确保在创建句柄时禁用
RaiseError
(默认值:false)。您可以使用PrintWarn
(默认值:false)和PrintError
(默认值:true)保存您自己执行的操作:
$dbh = DBI->connect($dsn, $user, $password,
{ RaiseError => 0, PrintWarn => 1, PrintError => 1 });
my $sth = $dbh->prepare($query);
foreach my $file (@filelist)
{
#.. get param1 , param2 , param3, param4 from $file
unless ( $sth->execute($param1,$param2,$param3,$param4) )
{
#warning already printed
next;
}
}
确保在创建句柄时禁用
RaiseError
(默认值:false)。您可以使用PrintWarn
(默认值:false)和PrintError
(默认值:true)保存您自己执行的操作:
$dbh = DBI->connect($dsn, $user, $password,
{ RaiseError => 0, PrintWarn => 1, PrintError => 1 });
my $sth = $dbh->prepare($query);
foreach my $file (@filelist)
{
#.. get param1 , param2 , param3, param4 from $file
unless ( $sth->execute($param1,$param2,$param3,$param4) )
{
#warning already printed
next;
}
}
您是否尝试过使用
eval{$dbh->execute(…);}对$dbh->execute($p1,$p2$”p3,$p4)
进行排序,或者{打印一些警告;下一步;}
?我遇到了相同的错误-数据库执行失败。错误消息:OpenClient消息:LAYER=(0)ORIGIN=(0)SEVERITY=(78)NUMBER=(51)服务器开发人员,数据库开发人员消息字符串:尝试启动一个新的自适应服务器操作,结果待定如何清除此错误。我不清楚这是DBI还是SQL错误。看起来该错误来自SQL server。你知道它是在你的程序中发布的吗?您的代码没有通过DBI进行任何错误处理。这是DBI在执行中可能做的事情吗?在foo.pm第123行的错误消息中是否有您没有显示的内容?在示例DDL中添加您正在访问的存储过程和/或表的CREATE
,以及准备创建此错误的语句以及准备的Perl代码将有所帮助。您可以通过这个问题添加一个。什么DBI版本,什么DBD驱动程序和版本?您是否尝试过使用eval{$dbh->execute(…);}对$dbh->execute($p1,$p2$”p3,$p4)
进行排序,或者{打印一些警告;下一步;}
?我收到了相同的错误-数据库执行失败。错误消息:OpenClient消息:LAYER=(0)ORIGIN=(0)SEVERITY=(78)NUMBER=(51)服务器开发人员,数据库开发人员消息字符串:尝试启动一个新的Adaptive Server操作,结果待定。如何清除此错误。我不清楚这是DBI还是SQL错误。该错误似乎来自SQL Server。您知道该错误在程序中的何处发出吗?您的代码没有通过DBI进行任何错误处理。是否为DBI在execute
中可能会做些什么?在foo.pm第123行的错误消息中是否有您没有显示的内容?添加示例DDL,其中包含您正在访问的存储过程和/或表的CREATE
,以及您准备创建此错误的语句以及准备的Perl代码p、 你可以通过这个问题添加一个。什么DBI版本,什么DBD驱动程序和版本?这个