Sql server 在Sqlserver上使用Perl DBI(DBD::ODBC)无法获取错误代码、类型和状态
我有一个perl脚本,它执行以下操作,只运行insert stmnt并执行一个错误。现在我可以看到错误已经生成,但是错误代码是错误的——SQL-42000,但是错误诊断方法没有返回任何信息。使用$DBI::err、$DBI::errstr、$DBI::state也不会打印正确的内容。只有$DBI::errstr正确显示Sql server 在Sqlserver上使用Perl DBI(DBD::ODBC)无法获取错误代码、类型和状态,sql-server,perl,transactions,dbi,raiserror,Sql Server,Perl,Transactions,Dbi,Raiserror,我有一个perl脚本,它执行以下操作,只运行insert stmnt并执行一个错误。现在我可以看到错误已经生成,但是错误代码是错误的——SQL-42000,但是错误诊断方法没有返回任何信息。使用$DBI::err、$DBI::errstr、$DBI::state也不会打印正确的内容。只有$DBI::errstr正确显示 $dbh->{RaiseError} = 1; $dbh->{PrintError} = 1; $dbh->begin_work; eval {
$dbh->{RaiseError} = 1;
$dbh->{PrintError} = 1;
$dbh->begin_work;
eval {
$dbh->do(INSERT INTO ..);
$dbh->do (RAISERROR ('User defined error',16,1) --purposely raising error
$dbh->commit;
1;
};
if ($@) {
print $@;
print "err() ==>".$dbh->err();
print "errstr() ==>".$dbh->errstr();
print "state() ==>".$dbh->state();
$dbh->rollback or warn "rollback failed";
}
输出:
DBD::ODBC::db do failed: [unixODBC][FreeTDS][SQL Server]User defined error (SQL-42000) ..
err() =>
errstr() =>
state() =>
您的代码示例已损坏(故意和缺少;,do call中缺少引号),错误42000是因为调用raiserror时出错,该错误为“附近语法不正确…”。我不知道,因为你确实展示了真正的工作代码。不管怎样,您的代码重写为以下内容对我很有用:
use DBI;
use strict;
use warnings;
my $dbh = DBI->connect('dbi:ODBC:xxx','xx','xx');
$dbh->{RaiseError} = 1;
$dbh->{PrintError} = 1;
$dbh->begin_work;
eval {
#$dbh->do(INSERT INTO ..);
$dbh->do (q/RAISERROR ('User defined error',16,1)/); #--purposely raising error
$dbh->commit;
1;
};
if ($@) {
print $@;
print "err() ==>".$dbh->err();
print "errstr() ==>".$dbh->errstr();
print "state() ==>".$dbh->state();
$dbh->rollback or warn "rollback failed";
}
和产出:
DBD::ODBC::db do failed: [unixODBC][Easysoft][SQL Server Driver][SQL Server]User defined error (SQL-42000) at so1.pl line 16.
DBD::ODBC::db do failed: [unixODBC][Easysoft][SQL Server Driver][SQL Server]User defined error (SQL-42000) at so1.pl line 16.
err() ==>1errstr() ==>[unixODBC][Easysoft][SQL Server Driver][SQL Server]User defined error (SQL-42000)state() ==>42000
我只是在最近的freeTDS上重复了这一点,效果也一样。