LINQ to SQL語句(19)之ADO.NET與LINQ to SQL

作者: 李永京  來源: 博客園  發布時間: 2008-09-18 17:14  閱讀: 11021 次  推薦: 2   原文鏈接   [收藏]  
 
摘要:這個系列的第十九篇,講解ADO.NET與LINQ to SQL。
[1] 連接與事務
[2] 直接執行SQL語句

系列文章導航:

LINQ to SQL語句(1)之Where

LINQ to SQL語句(2)之Select/Distinct

LINQ to SQL語句(3)之Count/Sum/Min/Max/Avg

LINQ to SQL語句(4)之Join

LINQ to SQL語句(5)之Order By

LINQ to SQL語句(6)之Group By/Having

LINQ to SQL語句(7)之Exists/In/Any/All/Contains

LINQ to SQL語句(8)之Concat/Union/Intersect/Except

LINQ to SQL語句(9)之Top/Bottom和Paging和SqlMethods

LINQ to SQL語句(10)之Insert

LINQ to SQL語句(11)之Update

LINQ to SQL語句(12)之Delete和使用Attach

LINQ to SQL語句(13)之開放式并發控制和事務

LINQ to SQL語句(14)之Null語義和DateTime

LINQ to SQL語句(15)之String

LINQ to SQL語句(16)之對象標識

LINQ to SQL語句(17)之對象加載

LINQ to SQL語句(18)之運算符轉換

LINQ to SQL語句(19)之ADO.NET與LINQ to SQL

LINQ to SQL語句(20)之存儲過程

LINQ to SQL語句(21)之用戶定義函數

LINQ to SQL語句(22)之DataContext

LINQ to SQL語句(23)之動態查詢

LINQ to SQL語句(24)之視圖

LINQ to SQL語句(25)之繼承

LINQ簡介

adsfsaf

 

ADO.NET與LINQ to SQL

它基于由 ADO.NET 提供程序模型提供的服務。因此,我們可以將 LINQ to SQL 代碼與現有的 ADO.NET 應用程序混合在一起,將當前 ADO.NET 解決方案遷移到 LINQ to SQL。

1.連接

在創建 LINQ to SQL DataContext 時,可以提供現有 ADO.NET 連接。對 DataContext 的所有操作(包括查詢)都使用所提供的這個連接。如果此連接已經打開,則在您使用完此連接時,LINQ to SQL 會保持它的打開狀態不變。我們始終可以訪問此連接,另外還可以使用 Connection 屬性自行關閉它。

//新建一個標準的ADO.NET連接:
SqlConnection nwindConn = new SqlConnection(connString);
nwindConn.Open();
// ... 其它的ADO.NET數據操作代碼... //
//利用現有的ADO.NET連接來創建一個DataContext:
Northwind interop_db = new Northwind(nwindConn);
var orders =
     from o in interop_db.Orders
     where o.Freight > 500.00M
     select o;
//返回Freight>500.00M的訂單
nwindConn.Close();

語句描述:這個例子使用預先存在的ADO.NET連接創建Northwind對象,本例中的查詢返回運費至少為500.00 的所有訂單。

2.事務

當我們已經啟動了自己的數據庫事務并且我們希望DataContext 包含在內時,我們可以向 DataContext 提供此事務。
通過 .NET Framework 創建事務的首選方法是使用 TransactionScope 對象。通過使用此方法,我們可以創建跨數據庫及其他駐留在內存中的資源管理器執行的分布式事務。事務范圍幾乎不需要資源就可以啟動。它們僅在事務范圍內存在多個連接時才將自身提升為分布式事務。

using (TransactionScope ts = new TransactionScope())
{
    db.SubmitChanges();
    ts.Complete();
}

注意:不能將此方法用于所有數據庫。例如,SqlClient 連接在針對 SQL Server 2000 服務器使用時無法提升系統事務。它采取的方法是,只要它發現有使用事務范圍的情況,它就會自動向完整的分布式事務登記。

下面用一個例子說明一下事務的使用方法。在這里,也說明了重用 ADO.NET 命令和 DataContext 之間的同一連接。

var q =
     from p in db.Products
     where p.ProductID == 3
     select p;
//使用LINQ to SQL查詢出來
//新建一個標準的ADO.NET連接:
SqlConnection nwindConn = new SqlConnection(connString);
nwindConn.Open();
//利用現有的ADO.NET連接來創建一個DataContext:
Northwind interop_db = new Northwind(nwindConn);
SqlTransaction nwindTxn = nwindConn.BeginTransaction();
try
{
    SqlCommand cmd = new SqlCommand("UPDATE Products SET"
    +"QuantityPerUnit = 'single item' WHERE ProductID = 3");
    cmd.Connection = nwindConn;
    cmd.Transaction = nwindTxn;
    cmd.ExecuteNonQuery();
    interop_db.Transaction = nwindTxn;
    Product prod1 = interop_db.Products.First(p => p.ProductID == 4);
    Product prod2 = interop_db.Products.First(p => p.ProductID == 5);
    prod1.UnitsInStock -= 3;
    prod2.UnitsInStock -= 5;//這有一個錯誤,不能為負數
    interop_db.SubmitChanges();
    nwindTxn.Commit();
}
catch (Exception e)
{
    //如果有一個錯誤,所有的操作回滾
    Console.WriteLine(e.Message);
}
nwindConn.Close();

語句描述:這個例子使用預先存在的 ADO.NET 連接創建 Northwind 對象,然后與此對象共享一個 ADO.NET 事務。此事務既用于通過 ADO.NET 連接執行 SQL 命令,又用于通過 Northwind 對象提交更改。當事務因違反 CHECK 約束而中止時,將回滾所有更改,包括通過 SqlCommand 做出的更改,以及通過Northwind 對象做出的更改。

[第1頁][第2頁]
2
0
 
標簽:LINQ LINQ to SQL
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()