Не получается код ошибки, тип и состояние с Perl DBI (DBD :: ODBC) на Sqlserver - PullRequest
2 голосов
/ 24 марта 2011

У меня есть 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() =>

1 Ответ

1 голос
/ 25 марта 2011

Ваш пример кода не работает (--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
...