在机房收费这个系统中是没有涉及到数据批量操作这样的功能的,假如用户某天提出了批量添加或修改学生(卡)信息这样的需求,我们应该怎样实现呢?
假设批量添加是通过DataGrid实现的,我们需要把DataGrid里面的每一条数据插入到数据库中。
方法一:
//循环表格的所有行,逐行插入 for (int i = 0; i < DataGrid.Rows.Count; i++) { DataRowView rows = DataGrid[i] as DataRowView; //取出表格的一行数据 CardinfoEntity enCardinfo = new CardinfoEntity(); //声明实体 //给实体赋值 enCardinfo.Cid = rows["Cid "].toString(); enCardinfo.Cardtype = rows["Cardtype "].toString(); enCardinfo.Cstatus = rows["Cstatus "].toString(); enCardinfo.Redate = rows["Redate "].toString(); new CardBLL().Insert(enCardinfo); //传入一个实体,插入信息 }
这样操作实现了批量添加的功能,但是仔细看看,假如我们插入了10条信息,这样程序在执行的时候一共走了10次(U<->B<->D)插入信息这条线,当然次数少我们看不出有什么影响,但是当同时插入上千条信息的时候呢?难道让程序再走上千次插入信息这个流程?这样程序的运行效率一下变负值了。并且如果程序采用一些服务如WCF的话,那就同时需要调用上千次WCF服务!假如在插入800条数据的时候程序崩溃了,剩下没插入的数据怎么处理?很显然也不能保证数据的完整性。
在数据量大的时候,这样做肯定是不可取的,怎么去改进呢?既然循环单条插入影响效率,那我们就应该想办法对这一条条的数据进行“打包”,然后再集中处理。
如何打包?这就用到了我们熟悉的List<>泛型集合。
方法二:
//声明一个CardinfoEntity类型的泛型集合 List<CardinfoEntity> enCardinfoList = new List<CardinfoEntity>(); for (int i = 0; i < DataGrid.Rows.Count; i++) { DataRowView rows = DataGrid[i] as DataRowView; //取出表格的一行数据 CardinfoEntity enCardinfo = new CardinfoEntity(); //声明实体 //给实体赋值 enCardinfo.Cid = rows["Cid "].toString(); enCardinfo.Cardtype = rows["Cardtype "].toString(); enCardinfo.Cstatus = rows["Cstatus "].toString(); enCardinfo.Redate = rows["Redate "].toString(); enCardinfoList.Add(enCardinfo); //将实体添加到集合中 } new CardBLL().Insert(enCardinfoList); //将整个集合传入数据层,循环List<>进行添加
声明一个List<>把要插入的信息全部添加到该集合中,然后统一传到数据访问层,进行添加操作。这样做程序只走了一遍流程,仅调用了一次WCF服务,提高了运行效率,再加上事务处理,也就很好的保证了数据的完整性。
现在写代码,不再是写出来就行,能实现功能就行。更需要考虑的是怎么让代码更有价值,让程序运行更有效率。
oノo════════════════════════════╲
│ヽ.学无止境, 分享至上。 │
│ 出自: http://blog.csdn.net/u010028869 .ヽ│
╲═════════════════════════════ヾ