在 Sqlserver 上使用 Perl DBI (DBD::ODBC) 无法获取错误代码、类型和状态
我有一个 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() =>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的代码示例已损坏( --thoughtly 和缺少 ;, do call 中缺少引号),并且错误 42000 是因为您调用 raiserror 时出现错误,即“附近的语法不正确...”。我无法判断,因为你确实展示了真正的工作代码。无论如何,您的代码重写为以下内容对我有用:
并输出:
Your code sample is broken (the --purposely and missing ;, missing quotes in do call) and the error 42000 is because you have an error calling raiserror which is "Incorrect syntax near ...". I can't tell because you do show real working code. Anyway your code rewritten as the following works for me:
and outputs: