首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 與 ADO.NET 互通:共用連線與交易整合實作

     編輯:關於.NET

共用現有 ADO.NET 連線

建立 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 與 SqlTransaction

慣用 TransactionScope 管理分散式交易;若針對 SQL Server 2000,SqlClient 會自動升級為分散式交易。

範例:ADO.NET 命令與 LINQ to SQL 共用交易

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 在同一交易下的原子性:任一失敗全數回滾。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved