将近三周的时间,我学到了很多知识,让我受益匪浅!也通过这三周的积累和整理,现在是时候写博客分享我的所知所得了。。下面主要写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
DataTableVS 泛型集合
此外,相对于DataTable,泛型集合还有很多的优点。。
安全
正确地使用泛型可真正减少代码的安全性问题
高性能
如果集合元素为值类型,它的性能要优于对应的非泛型集合,以及从非泛型集合派生的类型。因为使用泛型时,不必对元素进行装箱。
方便
减少输入,传输时只需要传一个实例T就可以获取它的任何属性。遍历方便,取到的都是单个的对象。
总结
从面向对象的角度思考,三层和泛型的结合,无疑是天造地设的一对儿,从而增强软件健壮性,提高开发效率,减低耦合度,方便了软件开发人员。。