2

我有一个 perl 脚本,它执行以下操作以运行插入 stmnt 并执行故意的 RAISERROR。现在我可以看到错误已生成但错误代码错误 - SQL-42000 ,但错误诊断方法不返回任何内容。使用 $DBI::err,$DBI::errstr,$DBI::state 也不会打印正确的内容。只有 $DBI::errstr 正确出现。

$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() =>
4

1 回答 1

1

您的代码示例已损坏(--purposely 和缺少 ;,在 do 调用中缺少引号)并且错误 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
于 2011-03-25T09:44:37.637 回答