DataTable和泛型哪个好?

来源:互联网 发布:莫烦python教学网站 编辑:程序博客网 时间:2024/03/29 06:20

         一开始重构的时候是用的DataTable,后来师父说要转为泛型,当初很不理解,为什么要这样呢?

          DataTable和泛型哪个好?

          答案是各有千秋……每一样东西都不可能是完美的,各有各的好处和缺点,如果完全能够被另外一种更先进的代替,那么这个东东就会被淘汰了。

一 、区别

          ①操作方便:DataTable
              访问方便:EntityList  

          ②按需索取那就是 泛型
              不管什么全部取出来 就用 datatable

二、DataTable的坏处

          无论是何种情况,使用DataTable不可避免的要填写读取的字段,这样做的坏处不言而喻:

            ⑴非常容易写错,而且编译器不检查。

            ⑵必须了解数据库的结构。

            ⑶不符合面向对象编程思想。

            ⑷DataTable为弱类型,无法直观的看出字段的数据类型。

三、泛型优点

          实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,存放到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。
          试想一下,这样一来,传到B层或U层的将是一个实体类集合,读取数据将会是如下场景:list[0].xxx;

          这样做的优点如下:

            ⑴编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况。

            ⑵不必了解数据库结构。

            ⑶符合面向对象思想。

            ⑷实体类的属性是强类型,每个字段的类型都是已知的。

四、转换方法

              要想从DataTable转换成泛型,很简单,首先将DataTable类型的数据全部转化为实体,将实体提取出来放到一个泛型集合中,返回这个集合,下面以一个Demo为例讲解如何使用泛型:
        1、首先有一个实体转换的类来完成这个转换:

 '将datatable转化为泛型集合        Public Shared Function convertToList(Of Turn As {New})(ByVal table As DataTable) As IList(Of Turn)        'convertToList(Of Turn As {New}) 这里的new是用来约束T的           Dim myList As New List(Of Turn)   '定义最终返回的集合            Dim myTpye As Type = GetType(Turn) '得到实体类的类型名            Dim dr As DataRow   '定义行集            Dim tempName As String = String.Empty   '定义一个临时变量            '遍历DataTable的所有数据行            For Each dr In table.Rows            Dim myTurn As New Turn    '定义一个实体类的对象                Dim propertys() As PropertyInfo = myTurn.GetType().GetProperties()  '定义属性集合                Dim Pr As PropertyInfo            '遍历该对象的所有属性                For Each Pr In propertys                tempName = Pr.Name '将属性名称赋值给临时变量                    If (table.Columns.Contains(tempName)) Then     '将此属性与datatable里的列明比较,查看datatable是否包含此属性                        '判断此属性是否有Setter                        If (Pr.CanWrite = False) Then   '判断此属性是否可写,如果不可写,跳出本次循环                            Continue For                    End If                    Dim value As Object = dr(tempName)  '定义一个对象型的变量来保存列的值                        If (value.ToString <> DBNull.Value.ToString()) Then '如果非空,则赋给对象的属性                            Pr.SetValue(myTurn, value, Nothing)    '在运行期间,通过反射,动态的访问一个对象的属性                        End If                End If            Next            myList.Add(myTurn)   '添加到集合            Next        Return myList   '返回实体集合        End Function
         2、在D层中我们每次将用table接收的数据,利用convertEntityToList函数进行转换即可,它的含义就是遍历表中的各个属性,将表中的每一行记录作为一个对象。

<strong><span style="font-size:18px;">Dim mylist As New List(Of Entity.StudentCardEntity)  Dim table As DataTable  table = SqlHelper.SqlHelper.GetDataTable(sql, CommandType.Text, paras)  mylist = SqlHelper.SqlHelper.convertEntityToList(Of Entity.StudentCardEntity)(table)  Return mylist  </span></strong>
              

           说的好像有点混乱,希望能给大家帮助!

0 0
原创粉丝点击