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);
}
}
}
}
メッセージは、クライアントによって印刷さキャッチ
例外:
-
:分散トランザクション
- InnerExceptionがnullの場合
- C# コンソールアプリケーションまたはCLRストアドプロシージャのトランザクションスコープが削除された場合、DTC トランザクションは作成されず、基になるエラー の情報が返されます。
ノートにキャンセルしたMicrosoft分散トランザクションコーディネータ(MS DTC)
見つかり作業 ボブBeauchemin氏(パートナー、MVP)によって提供 – AtTheMoment