Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在Sqlserver上使用Perl DBI(DBD::ODBC)无法获取错误代码、类型和状态_Sql Server_Perl_Transactions_Dbi_Raiserror - Fatal编程技术网

Sql server 在Sqlserver上使用Perl DBI(DBD::ODBC)无法获取错误代码、类型和状态

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 {

我有一个perl脚本,它执行以下操作,只运行insert stmnt并执行一个错误。现在我可以看到错误已经生成,但是错误代码是错误的——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() =>

您的代码示例已损坏(故意和缺少;,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上重复了这一点,效果也一样。