MARS (Multiple Active Result Sets) 是 ADO.NET 2.0 引入的關鍵特性,允許在單一 SqlConnection 上同時擁有多個作用中、唯讀、順向的結果集。SQL Server 2005 為首個支援 MARS 的商用資料庫。善用 MARS 可簡化程式碼、降低記憶體壓力、減少連線池爭用,對高併發 Web 應用尤為重要。
string connectionString = "Data Source=DBSERVER;" +
"Initial Catalog=AdventureWorlds;Integrated Security=SSPI;" +
"MultipleActiveResultSets=True";
預設為 False,可明確設定 False 停用。
假設需從查詢 A、B 取得資料,更新資料表 C,並寫入稽核記錄到資料表 D。
缺點:需在記憶體緩存查詢結果(如用 ArrayList),連線開關成本高,程式碼冗長。
SqlCommand 共用此連線SqlDataReader 讀取時,同步呼叫更新 C 的命令優勢:無需記憶體緩存中間結果、連線數降至 1、程式碼簡潔易維護。
// 連線 1:讀取訂單明細
SqlConnection readConn = new SqlConnection(connStr);
readConn.Open();
SqlCommand readCmd = new SqlCommand(sqlGetOrder, readConn);
using (SqlDataReader rdr = readCmd.ExecuteReader()) {
while (rdr.Read()) { ids.Add(rdr["ProductID"]); qtys.Add(rdr["OrderQty"]); }
}
readConn.Close();
// 連線 2:更新庫存
SqlConnection writeConn = new SqlConnection(connStr);
writeConn.Open();
SqlCommand writeCmd = new SqlCommand(sqlUpdateInv, writeConn);
// 參數設定...
for (int i=0; i
string connStr = "...;MultipleActiveResultSets=True";
SqlConnection marsConn = new SqlConnection(connStr);
marsConn.Open();
SqlCommand readCmd = new SqlCommand(sqlGetOrder, marsConn);
SqlCommand writeCmd = new SqlCommand(sqlUpdateInv, marsConn);
// 參數設定...
using (SqlDataReader rdr = readCmd.ExecuteReader()) {
while (rdr.Read()) {
writeCmd.Parameters["@amt"].Value = rdr["OrderQty"];
writeCmd.Parameters["@pid"].Value = rdr["ProductID"];
writeCmd.ExecuteNonQuery(); // 即時更新,無需緩存
}
}
marsConn.Close();
總結:MARS 是 ADO.NET 2.0 极具價值的進階功能,能顯著提升資料密集型應用的開發效率與執行效能。