Linq学习笔记(2.3)——DLinq高级操作

     前面我们学习了使用Dlinq,从面向对象的角度操作数据库的基本一些知识,今天我学习了Dlinq直接执行SQL命令可查询,执行存储过程,事务处理的一些知识,下面是我联系时的一些Demo。
     在这次学习前先向大家将两个Dlinq的知识:
     1:使用工具生成实体。
     前面学习的时候大家可能感觉最麻烦的是根据数据库写映射实体,vs专门提供了工具(C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\Bin\SqlMetal.exe)方便我们自动生成实体,
     SqlMetal /server:.\SQLExpress /database:Northwind /pluralize /namespace:Arcadia /code:d:\Northwind.cs
  大家可以在d:目录下找到Northwind.cs,将其拷贝到您的工程下,下面我们的代码就是在此文件下操作。

     2:显示Linq语句编译后的Sql语句
     方法1:用DataContext的Log属性。db.Log = Response.Output;
     方法2:用GetQueryText / GetChangeText。GetQueryText用于查询时使用,GetChangeText用于更新或删除。
var products = db.Products.Where(p => p.OrderDetails.Count > 50);
Response.Write(db.GetQueryText(products));


ExecuteQuery
    Northwind db = new Northwind("data source=.\\SQLEXPRESS;Integrated Security=SSPI;");
    var products 
= db.ExecuteQuery<Product>("select * from Products where ProductID<10");
    products.ToList().ForEach(p 
=> Response.Write(p.ProductName + "<br>"));


ExecuteCommand
   Northwind db = new Northwind("data source=.\\SQLEXPRESS;Integrated Security=SSPI;");
    db.ExecuteCommand(
"update [Products] set [ProductName] = {0} where [ProductID]={1}""Young's book"1);

ExecuteCommand用户更新,删除等操作, ExecuteQuery用于查询操作,所以在执行存储过程时要根据情况使用不同的语句。
        Northwind db = new Northwind("data source=.\\SQLEXPRESS;Integrated Security=SSPI;");
        var orders 
= db.ExecuteQuery<Order>("exec CustOrdersOrders @CustomerID={0}""ALFKI");
        orders.ToList().ForEach(o 
=> Response.Write(o.OrderID + "<br>"));


Transactions
Northwind db = new Northwind("data source=.\\SQLEXPRESS;Integrated Security=SSPI;");

        
if (db.Connection != null) db.Connection.Open();
        db.Transaction 
= db.Connection.BeginTransaction();
        IEnumerator
<OrderDetail> orders = db.OrderDetails.Where(o => o.ProductID == 1).GetEnumerator();        
        
while (orders.MoveNext())
        
{
            OrderDetail od 
= orders.Current;
            od.UnitPrice 
= 200;
        }


        var prod 
= db.Products.Single(p => p.ProductID == 1);
        db.Products.Remove(prod);
        
try{
            db.SubmitChanges();
            db.Transaction.Commit();
        }

        
catch{
            db.Transaction.Rollback();
            
throw;
        }

        
finally{
            db.Transaction 
= null;
        }
    官方的文档介绍Dinq的Transaction这样使用的,不过我有一点不明白,即使不使用Transaction,我测试SubmitChanges()本身就有类似Transaction的功能,如果一系列操作中有一个操作失败,这一系列操作都不会成功,请高手分析一下使用Transaction和直接SubmitChanges()的区别。
     上面这些是用来弥补Dlinq不好用对象处理的复杂数据库操作情景,上面的例子很简单,为了方便理解其使用方法。
posted @ 2007-06-17 19:27  Young.Jiang  阅读(4428)  评论(13编辑  收藏  举报