建立 DataContext 時可傳入既有 SqlConnection,後續所有操作(含查詢)將複用該連線。若連線已開啟,LINQ to SQL 會保持開啟狀態,開發者仍可自行關閉。
SqlConnection nwindConn = new SqlConnection(connString);
nwindConn.Open();
// ... 其他 ADO.NET 操作
Northwind interop_db = new Northwind(nwindConn);
var orders = from o in interop_db.Orders where o.Freight > 500 select o;
nwindConn.Close();
慣用 TransactionScope 管理分散式交易;若針對 SQL Server 2000,SqlClient 會自動升級為分散式交易。
SqlConnection nwindConn = new SqlConnection(connString);
nwindConn.Open();
Northwind interop_db = new Northwind(nwindConn);
SqlTransaction nwindTxn = nwindConn.BeginTransaction();
try {
// ADO.NET 直接執行 SQL
SqlCommand cmd = new SqlCommand("UPDATE Products SET QuantityPerUnit='single item' WHERE ProductID=3", nwindConn, nwindTxn);
cmd.ExecuteNonQuery();
// LINQ to SQL 參與同一交易
interop_db.Transaction = nwindTxn;
Product p1 = interop_db.Products.First(p => p.ProductID == 4);
Product p2 = interop_db.Products.First(p => p.ProductID == 5);
p1.UnitsInStock -= 3;
p2.UnitsInStock -= 5; // 違反 CHECK 約束
interop_db.SubmitChanges(); // 會拋出例外
nwindTxn.Commit();
} catch (Exception e) {
Console.WriteLine(e.Message); // 所有異動回滾
}
nwindConn.Close();
此例展示 ADO.NET SqlCommand 與 LINQ to SQL SubmitChanges 在同一交易下的原子性:任一失敗全數回滾。