【机房收费个人版】DataTable 与泛型集合的角力
【机房收费个人版】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,从而达到三层结构不被破坏的目的。那么,如何转化?以机房收费系统为例,看下面代码:
将转化为泛型集合:
D层代码的变化:
此外,相对于DataTable,泛型集合还有很多的优点。。
安全
正确地使用泛型可真正减少代码的安全性问题
高性能
如果集合元素为值类型,它的性能要优于对应的非泛型集合,以及从非泛型集合派生的类型。因为使用泛型时,不必对元素进行装箱。
方便
减少输入,传输时只需要传一个实例T就可以获取它的任何属性。遍历方便,取到的都是单个的对象。
总结
从面向对象的角度思考,三层和泛型的结合,无疑是天造地设的一对儿,从而增强软件健壮性,提高开发效率,减低耦合度,方便了软件开发人员。。
将近三周的时间,我学到了很多知识,让我受益匪浅!也通过这三周的积累和整理,现在是时候写博客分享我的所知所得了。。下面主要写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() = propertys Dim 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 If End If End If intCount += 1 Continue While End While ''添加到对象泛型集合中 ts.Add(act) Next Return ts End Function End 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.CheckUser Dim salHelper As New sqlHelper() Dim sql As String Dim flag As DataTable Dim myList As New List(Of UserEntity) sql = "select * from T_User" flag = sqlHelper.ExecSelectNo(sql, CommandType.Text) If flag.Rows.Count > 0 Then myList = ModelsHelper.ConvertList(flag, myList) Return myList Else Throw New Exception("数据库为空") Return Nothing End If End Function End Class #End Region
DataTable VS 泛型集合
此外,相对于DataTable,泛型集合还有很多的优点。。
安全
正确地使用泛型可真正减少代码的安全性问题
高性能
如果集合元素为值类型,它的性能要优于对应的非泛型集合,以及从非泛型集合派生的类型。因为使用泛型时,不必对元素进行装箱。
方便
减少输入,传输时只需要传一个实例T就可以获取它的任何属性。遍历方便,取到的都是单个的对象。
总结
从面向对象的角度思考,三层和泛型的结合,无疑是天造地设的一对儿,从而增强软件健壮性,提高开发效率,减低耦合度,方便了软件开发人员。。
- 3楼u013044029昨天 21:58
- 泛型比较灵活,但容易出错
- 2楼u013034223昨天 18:04
- 两者相比较,泛型的好处所在就更加明显了。
- 1楼u013043341前天 16:44
- 泛型的功能这么强大呀,合作的时候用用,加油!!!