所有的第一次(在这种情况下,重要的是)我的使用ActiveState的Perl(5.8.7建MSWin32-x86多线程)。

我只是出现了从一个三小时的调试届会议,试图找到源的一个错误。我发现根本就没有错误,但由于某些原因ADO的连接对象得到的 Errors.Count 增加的每个印刷消息在我的储存过程的输出。

考虑以下办SQL码:

CREATE PROCEDURE dbo.My_Sample() AS
BEGIN TRAN my_tran
-- Does something useful
if @@error <> 0 BEGIN
  ROLLBACK TRAN my_tran
  RAISERROR( 'SP My_Sample failed', 16, 1)
END ELSE BEGIN
  COMMIT TRAN my_tran
  PRINT 'SP My_Sample succeeded'
END

现在想象一个Perl子更多或更少,如:

sub execute_SQL {
  # $conn is an already opened ADO connection object
  # pointing to my SQL Server
  # $sql is the T-SQL statement to be executed
  my($conn, $sql) = @_;
  $conn->Execute($sql);
  my $error_collection = $conn->Errors();
  my $ecount = $error_collection->Count;
  if ($ecount == 0 ) { return 0; }
  print "\n" . $ecount . " errors found\n";
  print "Executed SQL Code:\n$sql\n\n";
  print "Errors while executing:\n";
  foreach my $error (in $error_collection){
    print "Error: [" . $error->{Number} . "] " . $error->{Description} . "\n";
  }
  return 1;
}

在其他地方,在主要Perl码,我呼吁以上分为:

execute_SQL( $conn, 'EXEC dbo.My_Sample' );

最终我得到了它, 打印的发言导致新的伪错误附加ADO错误的收集。速战速决我实现的是要改变这种印在SP成选择,以绕过这一点。

这问题我想要问的是:

  • 是这种行为正常的吗?
  • 有没有一种方法来避免/旁路吗?
有帮助吗?

解决方案

这是预料之中的,因为它是什么ADO会和Win32::ADO是一个相当薄薄的一层上。

ref:知识基础 注意RAISERROR和打印的发言返回通过ADO错误集合

其他提示

好的,后一个 很多 的测试和阅读,我来找到它解释说在波士'的文章"使用打印"(我的重点):

打印的发言是用于返回的消息来应用。印刷需要的任何一个字或Unicode串表达作为一个参数和返回的串作为一个消息给应用程序。消息是返回作为一个信息错误应用的使用SQLClient名字空间或件数据对象(ADO)、OLE数据库,并打开的数据库连接(ODBC)应用程序接口(Api)。 SQLSTATE设01000,错误地设定为0,和错误消息串设置的字符串中规定打印的发言。 串返回的消息处理器回呼功能在数据库库应用程序。

武装与这种知识适合我此维生素b6从 这DevX的文章 直到我得到这个:

sub execute_SQL {
  # $conn is an already opened ADO connection object
  # pointing to my SQL Server
  # $sql is the T-SQL statement to be executed
  # Returns 0 if no error found, 1 otherwise
  my($conn, $sql) = @_;
  $conn->Execute($sql);
  my $error_collection = $conn->Errors();
  my $ecount = $error_collection->Count;
  if ($ecount == 0 ) { return 0; }

  my ($is_message, $real_error_found);
  foreach my $error (in $error_collection){
    $is_message = ($error->{SQLState} eq "01000" && $error->{NativeError}==0);
    $real_error_found=1 unless $is_message;

    if( $is_message) {
      print "Message # " . $error->{Number}
      . "\n Text: " . $error->{Description} ."\n";
    } else {
      print "Error # " . $error->{Number}
      . "\n Description: " . $error->{Description}
      . "\nSource: " . $error->{Source} . "\n";
    }
  }

  print $message_to_print;
  return $real_error_found;
}

所以现在我Perl子正确地各种各样,真正错误(发出的SQL服务器通过RaisError)和一个共同的信息输出经由"打印"。

感谢理查德*哈里森为他的答案,它带领我到办法成功。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top