• 机房收费系统重构(六)—泛型集合


          机房收费系统重构仍在进行,但是在进行过程中,也许数据类型的转换是永远也避不开的,今天我就来讲讲关于数据类型转换的问题!

          在个人版机房收费系统中,在DAL层中,如果是增删改,是不需要返回参数的,返回值是Boolean,但是在查询中,需要有返回值,而且返回的是Dateset类型,所以在这里问题就来了。

         如果在返回值过程中一直返回的是表的类型,也许就没有那么多麻烦的事情了,但是dateset使得系统具有了强耦合性,但是如果返回的是实体类呢!关于这点我也查了查资料,为什么使用表会导致强耦合性呢?

         DataTable不允许透明检索数据,所以不影响用户界面的代码。意味着你的应用程序和数据库结构是强耦合的,对数据库结构的任何改变都需要你的程序有所改动,这应该是在数据访问层解决的问题,而不是用户界面层。很多时候,数据库都是为一个应用程序提供服务,这样数据组织起来很容易被使用。但是有些程序是建立在已有的数据库之上,这时候就不能对数据库做任何改动,因为还有其他程序在使用这个数据库,这种情况下,你的代码可能跟数据库耦合性更强。

         下面来看看机房收费中学生充值记录查询!(只贴部分代码)

     

    在DAL层中得到基本数据信息

      

    Imports System.Data.SqlClient
    Imports System.Data
    Imports IDAL
    Public Class DA_QueryChargeRec : Implements IDAL.IQueryChargeRec
        ''' <summary>
        ''' DAL层功能块,这里需要调用DateSetToList这个方法,然后进行数据转换。
        ''' </summary>
        ''' <param name="ChargeRec">实体类的命名</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function QueryCharge(ChargeRec As Model.MO_QueryChargeRec) As List(Of Model.MO_QueryChargeRec) Implements IDAL.IQueryChargeRec.QueryCharge
            Dim sqlparamas As SqlParameter() = {New SqlParameter("@CardNo", ChargeRec.CardNo)}
            Dim cmdtext As String = "select * from T_RechargeInfo where CardNo=@CardNo"  '查询数据库
            Dim DateSetList As New DA_DateSetToList  '实例化数据转换功能类
            Dim helper As New SqlHelper              '实例化sqlhelper
            Dim cmdtype As CommandType = New CommandType()
            cmdtype = CommandType.Text
            Dim table As New DataTable               '实例化一个表
            table = helper.ExecuteQuery(cmdtext, cmdtype, sqlparamas)  '返回表的数据
            If table.Rows.Count <> 0 Then                              '判断表是否为空
                Return DateSetList.DateSetToList(table)               '调用DateSetToList方法,返回泛型实体
            Else
                Return Nothing
            End If
        End Function
    End Class
    
    下面来看看上面调用的DateSetToList这个方法的代码:

    Public Class DA_DateSetToList : Implements IDAL.IDateSetToList
        Public Function DateSetToList(ByVal dt As DataTable) As IList(Of Model.MO_QueryChargeRec) Implements IDAL.IDateSetToList.DateSetToList
            '定义泛型集合
            Dim list As New List(Of Model.MO_QueryChargeRec)
            Dim type As Type = GetType(Model.MO_QueryChargeRec)
            '定义临时变量
            Dim tempName As String
    
            '遍历数据表中的每一行
            For Each dr As DataRow In dt.Rows
                '创建充值基本信息实体类
                Dim MoRechargeInfo As New Model.MO_QueryChargeRec
                Dim Propertys() As System.Reflection.PropertyInfo = MoRechargeInfo.GetType().GetProperties() '获得实体类enRechargeInfo的所有属性,并存放到数组中
                '遍历该对象的所有属性
                For Each pi As System.Reflection.PropertyInfo In Propertys
                    tempName = pi.Name '将属性名称赋值给临时变量
    
                    '检查DataTable是否包含此列(列名=对象的属性名)
                    If dt.Columns.Contains(tempName) Then '如果包含此列
                        If Not pi.CanWrite Then '如果该属性不可写,直接跳出
                            Continue For
                        End If
                        '如果该属性可写入
                        Dim value As Object = dr(tempName)
                        '如果非空,则赋给对象的属性
                        If Not IsNothing(value.ToString()) Then
                            Dim a As String = value.ToString().Trim()
                            pi.SetValue(MoRechargeInfo, a, Nothing)
                        End If
                    End If
                Next
                list.Add(MoRechargeInfo) '将充值信息实体添加到集合中
            Next
    
            Return list '返回泛型集合
    
        End Function
    End Class
    
        关于上面这个方法也许就是SqlHelper一样,算是一个模板吧,想用就会拿过来用。关于泛型集合代码还要多加研究。

       最后就是BLL层返回泛型集合,和UI层的展示部分了!


          关于这一部分自己理解也不是特别透彻,是自己敲到这里,给自己做一个快照,记录自己存在的问题,如有疑问和意见,踊跃拍砖!

      

  • 相关阅读:
    JavaScript手把手教你写出令人窒息的烂代码
    查询数据库表名,数据表信息,MySQL Key值(PRI, UNI, MUL)的含义
    【转载】 世界读书日:来自李开复的六个读书建议
    安装python库roboschool运行报错:ImportError: libpcre16.so.3: cannot open shared object file——解决方法
    Python 二次开发 AutoCAD 简介
    MATLAB元胞数组删除一个元素
    英语单词积累
    一战后德国要支付1320亿金马克的赔款,都按期足额付完了吗
    cad无级缩放
    [转]mysql导入数据load data infile用法
  • 原文地址:https://www.cnblogs.com/xzpblog/p/5117979.html
Copyright © 2020-2023  润新知