将近三周的时间,我学到了很多知识,让我受益匪浅!也通过这三周的积累和整理,现在是时候写博客分享我的所知所得了。。下面主要写DataTable、泛型集合以及它们之间的比较。。

DataTable
     概念
     DataTable是一个临时保存数据的网格虚拟表(表示内存中数据的一个表。)。它无须代码就可以简单的绑定数据库。使用它的对象包括DataSet和DataView。它可以独立创建和使用,最常见的情况是作为 DataSet 的成员使用。
     可以使用相应的 DataTable 构造函数创建 DataTable 对象。可以通过使用 Add 方法将其添加到 DataTable 对象的Tables 集合中,将其添加到 DataSet 中。
     也可以通过以下方法创建 DataTable 对象:使用 DataAdapter 对象的 Fill 方法在 DataSet 中创建。请注意,将一个 DataTable 作为成员添加到一个 DataSet 的 Tables 集合中后,不能再将其添加到任何其他 DataSet 的表集合中。
     缺点
     DataTable最大的缺点就是不安全!在使用中进行装箱和拆箱(装箱拆箱:利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换),耗费资源和时间,有可能造成数据的错误丢失!
     在敲击机房收费的过程中,我们可以发现,UI、BLL、DAL都直接访问它了,而我们自己写的Model被甩到了一边,破坏了我们的三层结构。那么,如何修复我们的结构呢?答案就是泛型集合。

泛型集合
     作用
     在机房收费系统中,泛型集合的最主要作用是将Datatable转化为Models,从而达到三层结构不被破坏的目的。那么,如何转化?以机房收费系统为例,看下面代码:
     将转化为泛型集合:

'**********************************************' 文  件  名:ModelsHelper' 命名空间:Models' 内       容:利用泛型集合,将datatable中的数据转换为实体集合' 功       能:' 文件关系:' 作       者:郭贤达' 小       组:个人' 生成日期:2015/6/5 21:40:17' 版  本  号:V1.0.0.0' 修改日志:' 版权说明:'**********************************************''泛型集合所需命名空间
Imports System.Collections.Generic
Imports System.Reflection#Region "ConvertList+郭贤达+2015.6.5 21:46:17"
Public Class ModelsHelper''' <summary>''' 将dataTable中的数据转换为实体集合''' </summary>''' <typeparam name="T"></typeparam>''' <param name="dt"></param>''' <param name="ts"></param>''' <returns></returns>''' <remarks></remarks>Public Shared Function ConvertList(Of T As New)(dt As DataTable, ts As IList(Of T))''获得T的类型Dim type As Type = GetType(T)''定义临时变量Dim strTemp As String = String.Empty'遍历表中所有行数For Each dr As DataRow In dt.Rows''定义类型变量act获取动态创建对象T的类型Dim act As T = If((Nothing Is Nothing), Activator.CreateInstance(Of T)(), Nothing)''引用反射,表示可获得对象的所有属性组成的集合Dim propertys As PropertyInfo() = act.[GetType]().GetProperties()''定义array变量,接收propertys中含有的属性,并提供对属性propertys元数据访问Dim array As PropertyInfo() = propertysDim intCount As Integer = 0'遍历所有对象属性''length表示所有维数中元素的总和While intCount < array.Length''pr表示元素中含有的属性,并提供对数据访问Dim pr As PropertyInfo = array(intCount)strTemp = pr.Name'列名=对象的属性名If dt.Columns.Contains(strTemp) Then'判断此属性是否设置函数''该属性是否可写If pr.CanWrite Then''定义一个对象型的列来保存列的值Dim value As Object = dr(strTemp)'如果非空,则赋值给对象的属性If value IsNot DBNull.Value Then''设置对象的属性值pr.SetValue(act, value, Nothing)End IfEnd IfEnd IfintCount += 1Continue WhileEnd While''添加到对象泛型集合中ts.Add(act)NextReturn tsEnd FunctionEnd Class
#End Region

D层代码的变化:

#Region "CheckUser+郭贤达+2015-06-10 20:20:08"
Public Class SqlServerCheckUserDAL : Implements IDAL.ICheckUserDAL''' <summary>''' 调用数据库中的数据看,并转化为List类型''' </summary>''' <returns></returns>''' <remarks></remarks>Public Function CheckUser() As List(Of UserEntity) Implements ICheckUserDAL.CheckUserDim salHelper As New sqlHelper()Dim sql As StringDim flag As DataTableDim myList As New List(Of UserEntity)sql = "select * from T_User"flag = sqlHelper.ExecSelectNo(sql, CommandType.Text)If flag.Rows.Count > 0 ThenmyList = ModelsHelper.ConvertList(flag, myList)Return myListElseThrow New Exception("数据库为空")Return NothingEnd IfEnd FunctionEnd Class
#End Region

DataTableVS 泛型集合
     此外,相对于DataTable,泛型集合还有很多的优点。。
     安全
     正确地使用泛型可真正减少代码的安全性问题
     高性能
     如果集合元素为值类型,它的性能要优于对应的非泛型集合,以及从非泛型集合派生的类型。因为使用泛型时,不必对元素进行装箱。
     方便
     减少输入,传输时只需要传一个实例T就可以获取它的任何属性。遍历方便,取到的都是单个的对象。

总结
     从面向对象的角度思考,三层和泛型的结合,无疑是天造地设的一对儿,从而增强软件健壮性,提高开发效率,减低耦合度,方便了软件开发人员。。

【机房收费个人版】DataTable 与泛型集合的较量相关推荐

  1. 【机房收费个人版】七层登陆

    敲完七层登陆之后,让我认识到所谓的七层就是在三层的基础上添加了两个模式和一个SqlHelper.外观模式完美的体现了依赖倒转原则和迪米特法则的思想,降低了耦合性:反射+配置文件+抽象工厂模式,用于实现 ...

  2. [工具类]DataTable与泛型集合List互转

    写在前面 工作中经常遇到datatable与list,对于datatable而言操作起来不太方便.所以有的时候还是非常希望通过泛型集合来进行操作的.所以这里就封装了一个扩展类.也方便使用. 类 方法中 ...

  3. 【机房收费个人版】SqlHelper

    之前敲完七层登陆之后,我天真的认为Sqlhelper就只是由一个function组成!!后来看到大家的博客,原来是由好几个function组成的,每个function都对应特定的数据库增删改查!现在想 ...

  4. 机房收费系统——转换list泛型时,字段名称不正确应出现故障

    因为之前对泛型研究了一番,所以就開始尝试着在机房收费系统重构中增加了泛型的使用. 可是到了做学生查看剩余金额这个功能的时候,还是依照之前的方法做的,可是在载入数据的时候班级这个框就没有显示出来--然后 ...

  5. 【机房收费个人版】触发器与存储过程

    这篇博客主要写的是触发器和存储过程的应用.实例.优点.不同及弊端,最后通过总的分析,总结出谁更胜一筹.. 触发器 定义      触发器是一种机制,用来强制业务规则和数据完整性,当指定表中的数据发生变 ...

  6. 【机房收费系统个人版】三层登陆

    机房收费个人版这个项目,很早就开始进行了,但是直到现在还没有完成..原因有两方面,首先是自身的个人管理不到位.做事拖拖拉拉,没有很好的节制自身的不良习惯:其次是思想价值观极端化.世界上没有谁能将所有事 ...

  7. 个人版机房收费——数据库设计

    在做机房收费系统个人版的时候又一次的遇到了数据库设计方面的内容,还记得第一次机房收费系统的时候,数据库的设计基本上是边敲边设计的,搞得特别的乱,也不符合编程的规范.既然我们现在已经是专业人士了,那么就 ...

  8. 机房收费系统.Net个人版总结

    机房收费系统.Net版到前两天为止才算是彻底完工了.从寒假开始的初步文档+图设计,以及之后的代码实现,到三月中旬开始的文档规范.图规范.代码规范.这个生命周期真是一个长啊.给自己总结了一下:本次机房收 ...

  9. .NET分层登陆——机房收费系统再总结

    去年的时候,我写过一篇机房收费系统登陆的总结文章,那是站在VB的基础上,直接查询数据库实现的登陆.是非常初期的知识.假设想了解详情,请看VB查询数据库之登陆窗口--机房收费系统总结(一). 今天.我要 ...

最新文章

  1. cin输入问题的处理:cin.clear() 、cin.sync() 、cin.ignore()
  2. python做自动化控制postman_python自动化测试入门篇-postman
  3. 【笔记】JAVA SE
  4. JMETER 各组件执行顺序与作用域
  5. 如何进行多语言发布,做国际化开发
  6. HTML:H5新特性
  7. Atitit gui界面ui技术发展史与未来趋势
  8. 计算机防雷安全标语,防雷电安全标语
  9. android ppsspp 存档位置,小鸡模拟器游戏存档在哪个文件夹
  10. 自然科学与军事技术史
  11. Mac电脑专业音乐制作Logic Pro X中文
  12. 工厂模式简介和应用场景
  13. c语言实验题数鸽子和兔子,[TZOJ] 平台训练-V1
  14. 【吐血整理】一份完备的集成学习手册!(附Python代码)
  15. 2019互联网BATJ等大厂中秋礼盒大PK
  16. Keystone的安装及其配置
  17. LeeCode 5454 前缀和 + 暴力
  18. 嵌入式新闻早班车-第9期
  19. 面对互联网风口下的人口老龄化,AI智能如何做好医疗健康管理?
  20. Android Framework 窗口子系统 (08)窗口动画之动画系统框架

热门文章

  1. 逆幂律模型_逆幂律曲线的基本架构永远不会改变
  2. Android 11.0 12.0蓝牙遥控器确认键弹不出输入法的解决方法
  3. matlab中除号的有效字符,乘号(x)、除号(÷)、双引号()等字符实体的HTML代码...
  4. 计算机课学生电脑怎么打开任务管理器,Win7系统电脑打开任务管理器的几种方法-电脑自学网...
  5. 怎么关闭Windows7显示器校准?
  6. 火狐中无法打开google的搜索结果的解决方式
  7. 阿里前端工程师面试题+解题思路
  8. iOS应用中增加emoji表情输入功能
  9. 六级词汇天天练(12.11)
  10. Welcome To ZOE's Blog