【机房收费个人版】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,从而达到三层结构不被破坏的目的。那么,如何转化?以机房收费系统为例,看下面代码:
     将转化为泛型集合:

'**********************************************

' 文  件  名: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就可以获取它的任何属性。遍历方便,取到的都是单个的对象。

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

你可能感兴趣的:(设计模式,泛型,VB.NET,结构)