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用于更新或删除。
ExecuteQuery
ExecuteCommand
ExecuteCommand用户更新,删除等操作, ExecuteQuery用于查询操作,所以在执行存储过程时要根据情况使用不同的语句。
Transactions
上面这些是用来弥补Dlinq不好用对象处理的复杂数据库操作情景,上面的例子很简单,为了方便理解其使用方法。
在这次学习前先向大家将两个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));
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>"));
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);
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>"));
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()的区别。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;
}
上面这些是用来弥补Dlinq不好用对象处理的复杂数据库操作情景,上面的例子很简单,为了方便理解其使用方法。