測試DTC設定-使用Mini C# Lab
每次安裝Web測試環境的一項重要檢查工作,是要確認Web與SQL間的DTC連線暢通,在經驗裡這是件眉眉角角很多的任務,光從我過去針對它寫過的KB、文章數量就可見一斑。
測試DTC通不通的方法,除了直接執行引用DTC的程式之外,還可以用MS的DTCPing工具。不過,這次介紹如何使用我寫的小工具Mini C# Lab來測試DTC。
測試原理請大家參考".NET 分散式交易程式開發FAQ(PDF)"一文,用Mini C# Lab跑以下的小程式,在TransactionScope中對SQL建立兩條連線會觸發使用DTC,因此若沒設好,第二個查詢會傳回錯誤。(【2010-11-12更新】以下寫法應用於SQL 2008時,會因連線字串相同而不觸發DTC,改良做法請見這裡)
using System;
using System.Data;
using System.Data.SqlClient;
using System.Transactions;
//REFDLL System.Data;System.Xml;System.Transactions
public class CSharpLab
{
private static void querySqlServer()
{
string cnStr = "Data Source=theSql;User Id=theUser;Password=thePasswd;";
using (SqlConnection cn = new SqlConnection(cnStr))
{
SqlCommand cmd = new SqlCommand("SELECT getdate() as D", cn);
cn.Open();
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
Console.WriteLine(dr["D"]);
cn.Close();
}
}
public static void Test()
{
using (TransactionScope tx=new TransactionScope())
{
querySqlServer();
querySqlServer();
tx.Complete();
}
}
}
以本次測試為例,因為"Network DTC Access"沒啟動,得到以下錯誤:
意外發現,錯誤訊息還挺明確的,本機Network DTC Access沒開時長這樣:
ERROR: Runtime error!
Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool
如果是遠端那台沒開啟長這樣:
ERROR: Runtime error!
The partner transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D025)
常被雞同鴨講聲東擊西指鹿為馬不知所云的錯誤訊息氣到吐血,看到這麼精確的訊息,就甘心A。