机房收费系统重构(六)—泛型集合
机房收费系统重构仍在进行,可是在进行过程中,或许数据类型的转换是永远也避不开的,今天我就来讲讲关于数据类型转换的问题。
在个人版机房收费系统中,在DAL层中,假设是增删改,是不须要返回參数的,返回值是Boolean,可是在查询中,须要有返回值。并且返回的是Dateset类型,所以在这里问题就来了。
假设在返回值过程中一直返回的是表的类型,或许就没有那么多麻烦的事情了,可是dateset使得系统具有了强耦合性,可是假设返回的是实体类呢!关于这点我也查了查资料,为什么使用表会导致强耦合性呢?
DataTable不同意透明检索数据。所以不影响用户界面的代码。
意味着你的应用程序和数据库结构是强耦合的。对数据库结构的不论什么改变都须要你的程序有所修改。这应该是在数据訪问层解决的问题。而不是用户界面层。非常多时候,数据库都是为一个应用程序提供服务,这样数据组织起来非常easy被使用。可是有些程序是建立在已有的数据库之上,这时候就不能对数据库做不论什么修改。由于还有其它程序在使用这个数据库。这样的情况下。你的代码可能跟数据库耦合性更强。
以下来看看机房收费中学生充值记录查询。(仅仅贴部分代码)
在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层的展示部分了!
关于这一部分自己理解也不是特别透彻,是自己敲到这里,给自己做一个快照,记录自己存在的问题,如有疑问和意见。踊跃拍砖。