DataTable转泛型

引言:

    刚开始敲机房的时候用的是DataTable返回数据,看博客的时候看大家都转泛型了,泛型是个是什么东东,为什么要用那?


是什么:

    泛型刚开始听到这个词的时候觉得很“高大上”,难于理解,那也得硬着头皮上对不对,查呗,,,

    百度上是这么说的:泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。 (ps:在.net Framework中的定义,跟java、C++中还是有些区别的

   现阶段在机房重构中用到的是List<T>,它只是泛型类(List<>线性表Dictionary<>字典,属于堆排序Queue<>队列Stack<>栈……)中的一种。


Datatable和泛型集合的区别:


实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,到实体类的属性中,再把所有的实体类存在泛型集合中

为什么要转?

    在机房重构中,主要体现在显示从数据库中查询的数据

用DataTable是这样的:

txtStudentNo.Text = dt.Rows(0).Item(2)
txtName.Text = dt.Rows(0).Item(3)
txtSex.Text = dt.Rows(0).Item(4)
txtGrade.Text = dt.Rows(0).Item(6)
txtClass.Text = dt.Rows(0).Item(7)
txtStatus.Text = dt.Rows(0).Item(11)
我们显示的信息必须对应数据库中各个字段对应的位置,增加了与数据库的耦合性。

用List(T)是这样的:

txtStudentNo.Text =mylist(0).studentNo
txtName.Text = mylist(0).Name
txtSex.Text = mylist(0).sex
txtGrade.Text = mylist(0).Grade
txtClass.Text = mylist(0).Class
txtStatus.Text = mylist(0).Status
直接显示对应List(T)泛型的属性,不用知道数据库中字段的顺序

如何转:

在D层中定义了一个类:

    '将datatable转化为泛型
    Public Shared Function convertToGeneric(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
        '定义最终返回的集合
        Dim myGenerics As New List(Of T)
        '得到实体类的类型名
        Dim myType As Type = GetType(T)
        '定义行集
        Dim dr As DataRow
        '定义一个临时变量
        Dim tempName As String = String.Empty
        '遍历datatable的所有数据行
        For Each dr In dt.Rows
            '定义一个实体类的对象
            Dim myT As New T
            '定义属性集合
            Dim propertys() As PropertyInfo = myT.GetType().GetProperties()
            Dim Pr As PropertyInfo
            '遍历改对象的所有属性
            For Each Pr In propertys
                tempName = Pr.Name    '将属性名称赋值给临时变量
                '检查datatable是否包含此列(列明==对象的属性名)
                If (dt.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(myT, value, Nothing)   '在运行期间,通过反射,动态访问一个对象的属性
                    End If
                End If
            Next
            myGenerics.Add(myT)  '添加到集合
        Next
        Return myGenerics   '返回实体集合
    End Function
在对应查询时调用此方法:

 Dim sqlhelper As New sqlHelper.sqlHelper
        Dim cmdType As New CommandType
        Dim cmdText As String
        cmdText = "select * from T_User "
        Dim dt As DataTable
        Dim myList As New List(Of Entity.UserInfo)
        dt = sqlhelper.ExecuteSelect(cmdText, cmdType)
        If dt.Rows.Count > 0 Then
            '调用转泛型的方法
            myList = ConvertToGenerics.convertToGeneric(Of Entity.UserInfo)(dt)
            Return myList
        Else
            Return Nothing
        End If


总结:

   虽然知道了泛型在机房中怎么用,但并没有真正地掌握泛型,希望在接下来不断学习,理解越来越透彻!

   若有哪里不对的地方,请多多指正!








你可能感兴趣的:(DataTable转泛型)