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

它基於由 ADO.NET 提供程序模型提供的服務。所以,咱們能夠將 LINQ to SQL 代碼與現有的 ADO.Net 應用程序混合在一塊兒,將當前 ADO.NET 解決方案遷移到 LINQ to SQL。sql

1.鏈接

     在建立 LINQ to SQL DataContext 時,能夠提供現有 ADO.NET 鏈接。對 DataContext 的全部操做(包括查詢)都使用所提供的這個鏈接。若是此鏈接已經打開,則在您使用完此鏈接時,LINQ to SQL 會保持它的打開狀態不變。咱們始終能夠訪問此鏈接,另外還可使用 Connection 屬性自行關閉它。數據庫

//新建一個標準的ADO.NET鏈接:
SqlConnection sqlConn = new SqlConnection(connString);
sqlConn.Open();
// ... 其它的ADO.NET數據操做代碼... //
//利用現有的ADO.NET鏈接來建立一個DataContext:
Northwind interDb = new Northwind(sqlConn);
var orders =
     from o in interDb.Orders
     where o.Freight > 500.00M
     select o;
//返回Freight>500.00M的訂單
sqlConn.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 服務器使用時沒法提高系統事務。它採起的方法是,只要它發現有使用事務範圍的狀況,它就會自動向完整的分佈式事務登記。spa

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

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 對象作出的更改。  對象

3.直接執行SQL語句

1.直接執行SQL查詢blog

若是 LINQ to SQL 查詢不足以知足專門任務的須要,咱們可使用 ExecuteQuery 方法來執行 SQL 查詢,而後將查詢的結果直接轉換成對象。事務

var products = db.ExecuteQuery<Product>(
    "SELECT [Product List].ProductID,"+
    "[Product List].ProductName " +
    "FROM Products AS [Product List] " +
    "WHERE [Product List].Discontinued = 0 " +
    "ORDER BY [Product List].ProductName;"
);

語句描述:這個例子使用ExecuteQuery<T>執行任意 SQL 查詢,並將所得的行映射爲 Product 對象的序列。內存

2.直接執行SQL命令

採用DataContext 鏈接時,可使用ExecuteCommand來執行不返回對象的 SQL 命令。

db.ExecuteCommand
    ("UPDATE Products SET UnitPrice = UnitPrice + 1.00");

語句描述:使用ExecuteCommand執行任意SQL命令,本例中爲將全部產品單價提升 1.00 的批量更新。

相關文章
相關標籤/搜索