系列回顾
前面的文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作和一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的条件查询两篇文章我演示了ORM的基本使用并引申到开发中最常见的条件查询业务,今天我基于前一篇文章的条件查询的基础演示根据条件的批量删除与更新。
问题提出
在演示ORM的基于操作一文中我们演示了基于单记录(实体)的删除(Update)和更新(处理),但是没有提到指量记录的更新与删除,本文旨在提出一种ORM应用中的解决方案并演示他的用法。
如果解决
批量更新与删除数据记录的本质是执行带批量查询条件的Update和Delete语句,ORM组件要完成这样的功能,所实现的思想就是根据条件生成批量更新的SQL语句,批量删除的SQL语句新式: delete +数据库表名+ where + 条件表达式,批量更新的SQL语句新式:update+数据库表名+set+(列名=?[,…])+ where + 条件表达式。
既然我们知道了这样的处理方法,那么我们就可以转换为ORM组件的表示方式进行处理,在ORM组件的ITable接口中存在着以下三个方法:
/// <summary> /// 从数据库中删除数据表记录。 /// </summary> /// <param name="condition">数据查询条件。</param> /// <remarks>删除操作所影响的数据行数。</remarks> void Delete(Condition condition); /// <summary> /// 根据条件更新数据库表中的指定列的值。 /// </summary> /// <param name="colValues">要更新的列及指定的值。</param> /// <param name="condition">数据查询条件。</param> /// <remarks>更新操作所影响的数据行数。</remarks> void Update(ColumnCollection colValues,Condition condition); /// <summary> /// 根据条件更新数据库表中的指定列的值。 /// </summary> /// <param name="colValues">要更新的列及指定的值。</param> /// <param name="condition">数据查询条件。</param> /// <remarks>更新操作所影响的数据行数。</remarks> void Update(IDictionary<string, object> colValues,Condition condition);
Delete方法使用很简单,带上删除记录的条件对象即可,Update方法的使用则复杂一些,除了设置更新记录的条件,还得设置更新列的内容,提供两种表示形式,ColumnCollection 集合与字典集合,其目的是完成字典名=?(值)的表示形式。
演示简介
关于条件查询以及条件的构造的知识差不多也就是这些,讲起来也没有什么讲头,重点才于如何组合这些条件实现复杂的业务,在今天的案例中我选择性的演示几个条件的用法,所使用的数据还是商品字典,达到以下的功能:
1.删除记录ID从100到500的记录并且单位为“1*瓶/瓶”的所有商品。
2.更新商品编码前2位为“1a”并且单位为“1*袋/袋”的所有商品的商品说明为“垃圾货”,本演示使用update的两种重载。
实现,在ClassLibDemo.DAL.SQLServer项目的类ProductList增加以下代码:
public void DeleteProduct(int iStart, int iEnd, string unit) { Condition condition = this.CreateCondition(); List<int> values = new List<int>(2); values.Add(iStart); values.Add(iEnd); condition.AddElement("IDN", values, ElementType.BetWeen); condition.AddElement("UNIT", unit); this.Delete(condition); } public void UpdateProductDescription(string code, string unit,string desc) { Condition condition = this.CreateCondition(); condition.AddElement("CODE", code, ElementType.MatchPrefix); condition.AddElement("UNIT", unit); Dictionary<string, object> values = new Dictionary<string, object>(); values.Add("DESCRIPTION", desc); this.Update(values,condition); } public void UpdateProductDescription2(string code, string unit,string desc) { Condition condition = this.CreateCondition(); condition.AddElement("CODE", code, ElementType.MatchPrefix); condition.AddElement("UNIT", unit); ColumnCollection values = new ColumnCollection(this); values.AddColumn("DESCRIPTION",DbType.String,desc); this.Update(values,condition); }
我们在控制台演示项目中使用这些查询:
class ConditionUpdate { /// <summary> /// 删除记录ID从到的记录并且单位为“*瓶/瓶”的所有商品。 /// </summary> public void DemoConditionDelete() { ProductList table = new ProductList(); table.OrmAccessor = OrmContext.OrmAccessor; table.DeleteProduct(100, 500, "1*瓶/瓶"); System.Console.WriteLine("删除完成"); } /// <summary> /// 更更新商品编码前2位为“1a”并且单位为“1*袋/袋”的所有商品的商品说明为“垃圾货”。 /// </summary> public void DemoConditionUpdate() { ProductList table = new ProductList(); table.OrmAccessor = OrmContext.OrmAccessor; table.UpdateProductDescription("1a", "1*袋/袋", "垃圾货"); System.Console.WriteLine("更新完成"); } /// <summary> /// 删更新商品编码前2位为“1a”并且单位为“1*袋/袋”的所有商品的商品说明为“垃圾货”。 /// </summary> public void DemoConditionUpdate2() { ProductList table = new ProductList(); table.OrmAccessor = OrmContext.OrmAccessor; table.UpdateProductDescription2("1a", "1*袋/袋", "垃圾货"); System.Console.WriteLine("更新完成"); }
案例输出结果:
SQL事件探查:
有关本例子所涉及的数据表结构请参考
基于AgileEAS.NET平台基础类库进行应用开发-总体说明及数据定义一文,有关数据对象模型定义文件、文档、DDL脚本请下载:
http://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本文代码下载:
ORM.Demo3.rar。
链接
QQ群:116773358
本文转自 agilelab 51CTO博客,原文链接:http://blog.51cto.com/agilelab/603027