DataTable是一个临时保存数据的表,我们在机房收费系统中,将查到的数据先暂时存放在DataTable上,然后将DataTable一层一层的进行传递,最终传到U层,把用户需要的数据呈现给用户。在使用DataTable返回值的时候,我们总是能够在U层看到这样的代码,这就要求我们必须要对于数据库的设计相对熟悉,每个字段的位置了解。返回在U层显示的时候一不小心就会数据混乱。
txtClass.Text = card.Rows(0)(5).ToString() txtName.Text = card.Rows(0)(3).ToString() txtDepartment.Text = card.Rows(0)(8).ToString() txtGrass.Text = card.Rows(0)(4).ToString() txtSex.Text = card.Rows(0)(2).ToString() txtState.Text = card.Rows(0)(7).ToString() txtCash.Text = card.Rows(0)(6).ToString() txtStuNo.Text = card.Rows(0)(1).ToString()
泛型:是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。其实不懂,查了很多资料,看到一个解释,也不知道准确与否。泛型,顾名思义就是泛泛的类型。也就是没有确定的类型。那么没有确定类型怎么使用呢?实际上,使用的时候规定类型就行了。个人觉得这样理解更好。
泛型的好处:
1、减少输入,传输时只需要传一个实例T就可以获取它的任何属性,便利方便,取到的都是单个的对象。
2、正确的构建泛型类可以真正的减少代码中的安全性问题。
3、使用泛型类还可以提高性能。
如何实现:
在三层架构中,实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。这样一来,传到B层或U层的将是一个实体类的泛型集合。
具体使用:
将DataTable转换成一个实体填充泛型集合的方法抽象出来,写成一个类似于SQLHelper的工具类,放在D层,用的时候直接调用。
Imports System.Collections.Generic '增加泛型的命名空间 Imports System.Reflection '引入反射:为了使用PropertyInfo '说明:将DataTable转化为泛型集合 '命名空间:DAL '机器名称:DAVINA '创建日期:2016年3月24日10:19:38 '作者: '版本号:V1.00 Public Class ConvertHelper '将datatable转化为泛型集合 Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T) '注意:convertToList(Of T As {New}) 这里的new是用来约束T的,必须有,不然new T的时候会出现错误 Dim myList As New List(Of T) '定义最终返回的集合 Dim myTpye 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 myList.Add(myT) '添加到集合 Next Return myList '返回实体集合 End Function End Class
Public Function CheckCard(Card As RemainMoneyEntity) As List(Of RemainMoneyEntity) Implements IRemainMoney.CheckCard Dim sqlHelper As New sqlHepler.sqlHelper '实例化sqlhelper Dim sql As String Dim table As DataTable Dim sqlParams As SqlParameter() = {New SqlParameter("@CardID", Card.CardID)} '传参 sql = "Select * from RemainMoney where CardID=@CardID " '查询,在这里使用了视图。 table = sqlHelper.ExecSelect(sql, CommandType.Text, sqlParams) '执行查询 Dim myList As List(Of Entity.RemainMoneyEntity) '保存转换后的泛型集合 If table.Rows.Count > 0 Then '先判断是否为空 myList = ConvertHelper.convertToList(Of Entity.RemainMoneyEntity)(table) Return myList Else Return Nothing End If End Function