DataTable转化为泛型集合

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


       对于泛型集合,前面有非常多男神女神已经写的非常具体了。

可是知识自己总结的才干算是印脑子里了。我就写写自己的理解吧。

       看完关于泛型集合的相关资料(博客、设计模式、网上其它一些介绍。。。

)。理一理思路:

是什么?

    [泛型是具有占位符(类型參数)的类、结构、接口和方法。

这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。

 

    泛型集合类能够将类型參数用作它所存储的对象的类型的占位符;类型參数作为其字段的类型和其方法的參数类型出现。

]——MSDN






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


<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转化为泛型集合就是在转化类中写了一个转化方法,写好之后在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>


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

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

        

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


转载于:https://www.cnblogs.com/jzdwajue/p/6993510.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值