DataTable转化为泛型集合

        前一段时间,因为做机房重构基本思路都没有搞清楚,然后周围接触的概念太多了,就想一开始什么都加上,不堪重负,起步很慢。后来经亮哥提点,一点一点的加东西,就好很多了。


       对于泛型集合,前面有很多男神女神已经写的很详细了。但是知识自己总结的才能算是印脑子里了。我就写写自己的理解吧。

       看完关于泛型集合的相关资料(博客、设计模式、网上其他一些介绍。。。),理一理思路:

是什么?

    [泛型是具有占位符(类型参数)的类、结构、接口和方法。这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。

 

    泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。]——MSDN


 
 


       泛型集合其实就是一个个的实体类集合,我们在没有接触这个概念前,数据库访问返回的类型有实体、DataTable、Boolean。下面是画了几张示意图:

DataTable转化为泛型集合_第1张图片DataTable转化为泛型集合_第2张图片DataTable转化为泛型集合_第3张图片

<span style="font-size:18px;">D层</span>
<span style="font-size:18px;">Imports System.Data
Imports System.Data.SqlClient
Imports Entity

Public Class AddDeleteDAL

    Public Function SelectDAL(ByVal SUserInfo As Entity.Users) As  Entity.Users  '查询表
        Dim SU As New Entity.Users    '定义实体类

        '连接数据库读取数据,为DataGridView赋值
        Dim conn As New SqlConnection        '定义连接数据库
        Dim cmd As New SqlCommand            '定义数据库命令

        Dim dt As New DataTable
        conn = New SqlConnection(SQLUtil.connstring())       '实例化SQLUntil中返回的字符串,
        cmd.Connection = conn                 '为字符串赋值

        '查询字符串
        cmd.CommandText = "Select * From T_Users Where Level=@Level"

       
        cmd.Parameters.Add(New SqlParameter("@Level", SUserInfo.Level))
       
        cmd.CommandType = CommandType.Text

        conn.Open()            '打开数据库

        Dim ds As New DataSet    '定义一个dataset  
        Dim da As New SqlDataAdapter  '定义一个sqldataadapter  ,dataset和sql sever的桥梁
        da.SelectCommand = cmd
        '填充dataset  
        'da.Fill(ds)
        da.Fill(ds, "Userinfo")
        dt = ds.Tables("Userinfo")

        'Select Case
        conn.Close()
        Return dt              '返回值
    End Function</span>


有哪些好处?

        如果不用泛型集合,你要是查询有多少个用户的时候(添加删除用户),单个实体和Boolean肯定是不行的,DataTable倒是可以,可以把但是它因为高耦合(一个用户信息变化,就得修改DataTable),使系统运行的性能会不好.

DataTable转化为泛型集合_第4张图片

怎么用?

        首先明白DataTable转化为泛型集合就是在转化类中写了一个转化方法,写好之后在D层实例化该类的返回类型。

Imports System.Collections.Generic  '增加泛型的命名空间
Imports System.Reflection '反射
Public Class GetGenerics
    '将DataTable转化为泛型集合会降低耦合度
    Public Shared Function ConvertToList(Of T As {New})(DataTable As DataTable) As IList(Of T) 'ConvertToList(Of T As {New}) 这里的New是用来约束T的,必须有,不然New T的时候会出现错误
        '实例化最终返回的实体集合
        Dim myList As New List(Of T)
        '得到实体类的类型名
        Dim myType As Type = GetType(T)
        'Dim myType As Type
        'myType = GetType(T)
        '定义行集
        Dim DataRow As DataRow
        '定义一个临时变量
        Dim TmpName As String = String.Empty

        '遍历DataTable的所有数据行
        For Each DataRow In DataTable.Rows

            '定义一个实体类的对象
            Dim myT As New T
            '定义属性集合
            Dim propertys() As PropertyInfo = myT.GetType().GetProperties()
            '定义一个对象pr
            Dim pr As PropertyInfo

            '遍历该对象的所有属性
            For Each pr In propertys
                TmpName = pr.Name       '将属性名称赋值给临时变量

                '检查DataTable是否包含此列(列名==对象的属性名)
                If (DataTable.Columns.Contains(TmpName)) Then  '将此属性与DataTable里的列名比较,查看DataTable是否包含此属性
                    '判断此属性是否有Setter(类)

                    If (pr.CanWrite = False) Then       '判断此属性是否可写,如果不可写,跳出本次循环,进入下一次循环;exit for 是退出整个循环
                        Continue For
                    End If

                    Dim value As Object = DataRow(TmpName)      '定义一个对象型的变量来保存列的值

                    If (value.ToString <> DBNull.Value.ToString()) Then     '如果非空,则赋给对象的属性
                        pr.SetValue(myT, value, Nothing)           '在运行期间,通过发射,动态地访问一个对象的属性
                    End If
                End If
            Next
            myList.Add(myT)
        Next
        Return myList       '返回实体集合
    End Function

End Class

D层代码:

<span style="font-size:18px;">Public Class AddDeleteDAL

    Public Function SelectDAL(ByVal SUserInfo As Entity.Users) As List(Of Entity.Users)   '查询表
        Dim SU As New Entity.Users    '定义实体类

        '连接数据库读取数据,为DataGridView赋值
        Dim conn As New SqlConnection        '定义连接数据库
        Dim cmd As New SqlCommand            '定义数据库命令

        Dim dt As New DataTable
        conn = New SqlConnection(SQLUtil.connstring())       '实例化SQLUntil中返回的字符串,
        cmd.Connection = conn                 '为字符串赋值

        '查询字符串
        cmd.CommandText = "Select * From T_Users Where Level=@Level
       
        cmd.Parameters.Add(New SqlParameter("@Level", SUserInfo.Level))
        cmd.CommandType = CommandType.Text

        conn.Open()            '打开数据库

        Dim ds As New DataSet    '定义一个dataset  
        Dim da As New SqlDataAdapter  '定义一个sqldataadapter  ,dataset和sql sever的桥梁
        da.SelectCommand = cmd
        '填充dataset  
        'da.Fill(ds)
        da.Fill(ds, "Userinfo")
        dt = ds.Tables("Userinfo")
        </span>
<span style="font-size:18px;"><span style="white-space:pre">	</span>Dim mylist As New List(Of Entity.Users)
        mylist = GetGenerics.ConvertToList(Of Entity.Users)(dt)</span>
<span style="font-size:18px;">
        conn.Close()
        Return mylist              '返回值
    End Function</span>


        最后返回的值就是泛型集合了。

        在这个学习过程中,我感受很多,由浅入深,一点一滴的积累,厚积薄发。

        

         有很多理解有误的地方,希望各位帅哥美女们给指点指点。


你可能感兴趣的:(DataTable转化为泛型集合)