2011-11-10 36 views
2

DTCトランザクション内でSSISパッケージから呼び出されたCLRストアドプロシージャで例外がスローされると、クライアント(SSISパッケージ)に返されるエラーは基本的な例外ではなく、DTC。SSRパッケージからDTCトランザクションで呼び出されたCLRストアドプロシージャの詳細を取得する方法

クライアントに返される基本エラーの情報を持つことは可能ですか?

メモ:SQL Server Management Studioからストアドプロシージャを実行すると、分散トランザクションの外部で、基礎となるエラーの詳細情報が返されます。

Error: Executing the query "StoredProcedure” failed with the following error: “The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction”. Possible reasons: Problems with the query, “ResultSet” property not set correctly, parameters not set correctly, or connection not established correctly.

すべてのコードが1つのSQL Server 2008インスタンスで実行されています。

SSIS Package 
---> Sequence Container (TransactionOption = Required) 
---> Execute SQL Task (ADO.NET Connection Manager, SQLClient DataProvider) 
---> SQL Server CLR Stored Procedure (No exception handling code) 
---> TransactionScope(TransactionScopeOption.Required) 

次のコードは、問題を示しているが、そのクライアントにタイトルに説明したシナリオとは異なり

C#のコンソールアプリケーションではなく、SSISパッケージされている問題

を再現コードCLR保存手順

using System; 
using System.Transactions; 

public partial class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void ExceptionStoredProcedure() 
    { 
     using (TransactionScope scope = new TransactionScope()) 
     { 
      throw new Exception(@"Test exception thrown from ""ExceptionStoredProcedure"""); 
     } 
    } 
}; 

C#コンソールアプリケーションクライアント

using System; 
using System.Data.SqlClient; 
using System.Transactions; 

namespace SQLCLRTester 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       using (TransactionScope scope = new TransactionScope()) 
       { 
        string connectionString = "Data Source=.; Initial Catalog=Experiments; Integrated Security=Yes"; 

        using (SqlConnection noOpConnection = new  SqlConnection(connectionString)) 
        { 
         noOpConnection.Open(); 

         using (SqlConnection connection = new SqlConnection(connectionString)) 
         { 
          SqlCommand command = 
           new SqlCommand() 
           { 
            CommandText = "ExceptionStoredProcedure", 
            CommandType = System.Data.CommandType.StoredProcedure, 
            Connection = connection 
           }; 
          connection.Open(); 
          command.ExecuteNonQuery(); 
         } 

        } scope.Complete(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Exception caught: {0}", ex.Message); 
      } 
     } 

    } 
} 

メッセージは、クライアントによって印刷さキャッチ

例外:

    :分散トランザクション

    ノートにキャンセルしたMicrosoft分散トランザクションコーディネータ(MS DTC)

  1. InnerExceptionがnullの場合
  2. C# コンソールアプリケーションまたはCLRストアドプロシージャのトランザクションスコープが削除された場合、DTC トランザクションは作成されず、基になるエラー の情報が返されます。
+0

見つかり作業 ボブBeauchemin氏(パートナー、MVP)によって提供 – AtTheMoment

答えて

0

Bob Beauchemin(Partner、MVP)が提供するリンクのおかげで、SqlContext.Pipe.Send()を使用する回避策が見つかりました。以下のコードを参照してください。

注:SqlClientではSqlClientでを使用するクライアントコードが手順

using System; 
using System.Transactions; 
using Microsoft.SqlServer.Server; 
using System.Data.SqlClient; 

public partial class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void ExceptionStoredProcedure() 
    { 
     using (TransactionScope scope = new TransactionScope()) 
     { 
      try 
      { 
       throw new Exception(@"Test exception thrown from  ""ExceptionStoredProcedure"""); 
       scope.Complete(); 
      } 
      catch (Exception ex) 
      { 
       if (Transaction.Current.TransactionInformation.DistributedIdentifier != Guid.Empty) 
        SqlContext.Pipe.Send(ex.Message); 

       throw; 
      } 
     } 
    } 


}; 

メッセージストアド

CLRを変更する必要はありませんので、SqlException.MessageにSQL Serverによって送信された "情報メッセージ" を追加印刷されたクライアント

例外が検出されました:Microsoft分散トランザクションコーディネーター(MS DTC)がdisトリビュートトランザクション。「ExceptionStoredProcedure」DTCトランザクションについてのボブで見つかった記事のリンクに基づいて

可能性のある説明

からスロー

テスト例外私は次のように観測された行動が展開かもしれないと思う中止とT-SQLのTRY/CATCH :

  1. CLRストアドプロシージャのトランザクションスコープで例外が発生すると、 トランザクションの中止投票がDTCに送信されます。
  2. DTCは、SQL Serverを含むすべての参加リソースマネージャ に対してアボート要求を送信
  3. SQL ServerはCLRストアドプロシージャが
  4. アテンション信号がどのように変化実行されている SQL Serverセッションへの注目信号に要求を中止変換 SQL ServerのCLR例外メッセージ でターン結果に結果に含まれていない未処理 CLR例外を除いて、コードの扱いをホストするには、クライアントに芸術へ

リンクを返さicles:記事へのリンクのおかげで周りの

http://connect.microsoft.com/SQLServer/feedback/details/414969/uncatchable-error-when-distributed-transaction-is-aborted

http://msdn.microsoft.com/en-us/library/ms179296(SQL.90).aspx

関連する問題