机房重构——Datatable与泛型

来源:互联网 发布:淘宝txt 编辑:程序博客网 时间:2024/06/02 15:09

刚开始敲机房的时候好多人都用了Datatable,我也就跟着用了,毕竟了解还不够深入,不如先站在巨人的肩膀上,用一下。但是到查询学生余额的时候感觉赋值的时候太麻烦了,在网上查资料,发现了泛型可以很好的解决我的问题,在认识这个小精灵前我们先来看看DataTable是怎么回事。

一、DataTable:

一个DataSet中可以有多个DataTable,一个DataTable中可以有多个DataRow。组合一起就是一个虚拟的数据库结构。在程序中,DataTable就是一张表,可以给他定义各种数据类型的列。然后给他赋值,和数据库中的表的作用是一样的。唯一不同的是:他的数据是虚拟的。

用datatable,我们看U层显示代码:

<span style="font-size:18px;">CardInfo.CardNo = dt.Rows(0)(0) CardInfo.Dates = dt.Rows(0)(5)CardInfo.Time = dt.Rows(0)(6)CardInfo.Status = dt.Rows(0)(7)CardInfo.CardType = dt.Rows(0)(1)CardInfo.Cash = dt.Rows(0)(2)CardInfo.StudentNo = dt.Rows(0)(3)</span>

每个属性都要对应好具体的字段,否则就出错,如果数据库中的属性够多,难道我们还要一个个对应写上吗?显然这样做费时费力,效率很低,所以就引进了泛型集合list。

二、泛型list<T>:

1、理解:

集合中的每个元素都是一个实体,而每个实体都相当于DataTable中的一条记录,DataTable是多条记录的集合,而list<>是多个实体的集合。

U层代码:

Dim num As Integernum = mylist.Count - 1txtCardno.Text = mylist(num).CardnotxtClass.Text = mylist(num).onClasstxtDepartment.Text = mylist(num).DepartmenttxtGrade.Text = mylist(num).GradetxtSex.Text = mylist(num).SextxtStatus.Text = mylist(num).StatustxtStudentname.Text = mylist(num).StudentNametxtStudentno.Text = mylist(num).StudentnolblCash.Text = mylist(num).Cash

2、泛型的好处:

(1)遍历方便,取的是单个实体,无需拆装箱,查询方便;

(2)减少输入,只需要一个实例T就可以获取它的任何属性;

(3)正确构建泛型类,可以减少代码中的安全问题;

(4)工作量小,提升系统性能。

3、(1)如何转为泛型?

<span style="font-size:18px;">    '将datatable转换为泛型集合    Public Shared Function converToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)        Dim mylist As New List(Of T)        '定义最终返回的集合        Dim mytype As Type = GetType(T)     '得到实体类的类型名        Dim dr As DataRow                   '定义行集        Dim Tmpname 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                Tmpname = pr.Name           '将属性名称赋值给全局变量                '检查datatable是否包含此列,列名==对象的属性名                If (dt.Columns.Contains(Tmpname)) Then '将此属性名与datatable的列名比较,查看datatable是否包含此属性                    '判断此属性是否有setter类                    If (pr.CanWrite = False) Then '此属性若不可写                        Continue For                    End If                    Dim value As Object = dr(Tmpname) '定义一个对象的列来保存列的值                    If (value.ToString <> DBNull.Value.ToString()) Then '判断是否为空,如果非空,则赋给对象的属性                        pr.SetValue(myT, value, Nothing) '在运行期间通过反射,动态访问一个动态的属性                    End If                End If            Next            mylist.Add(myT) '将myT对象添加到集合        Next        Return mylist '返回实体集合    End Function</span>
(2)D层调用:

<span style="font-size:18px;">'实现接口中方法    Private sqlHelper As New SqlHelper.SqlHelper    Public Function cashlist(ByVal e_Stucard As Entity.StucardEntity) As IList(Of Entity.StucardEntity) Implements IDAL.CashRecordIDAL.cashlist        Dim sql As String        Dim sqlParams As SqlParameter() = {New SqlParameter("@Cardno", e_Stucard.Cardno)}        sql = "select * from V_Stucard where Cardno=@Cardno"        Dim table As DataTable        table = sqlHelper.ExecSelect(sql, CommandType.Text, sqlParams)        Dim mylist As IList(Of Entity.StucardEntity)        <span style="color:#3333ff;">mylist = Entity.EntityMoudule.converToList(Of Entity.StucardEntity)(table)'转换语句</span>        Return mylist    End Function</span>

三、了解:

现在的DataTable慢慢退出历史舞台:
1.List<T>是强类型化的,而DataTable不是一般的DataTable,访问某列时,是通过string的ColumnName来取得的,比如:string name = dt.Rows[i]["Name"].ToString();
因为是string的列名,存在记错写错的风险,且编译不检查;而List<T>,因为类型化的元素,编程时属性可以有IDE的智能感知来选择,编码更方便。不容易出错:string name = list[0].Name;

2.Linq的强有力支持,使得操作List<T>有前所未有的快感
其实在linq出来之前,还是DataTable用的多,因为要想过滤数据,可以用
DataView,DataTable.Select()等方法。而List<T>只能是自己写循环,麻烦。Linq出来之后,where,join,group by,order by...等等操作,对于List<T>的查询真是很便利。

3.DataTable的结构远比List<T>要复杂,内存占用量更大。
在有变化的场合下,DataTable里要维护不同RowState的数据(修改前的和现在的),还有Schema数据
List<T>就没有这些累赘,更轻快。

所以,Linq+List<T>才使得现在大家越来越倾向使用List<T>而不是DataTable

四、总结:

list泛型好用,但是他在绑定数据时也会产生很多麻烦,如:在更新数据时要将list<T>重新实例化后在绑定数据才会刷新到控件上显示,所以list<T>是可选择性的技术。

这些东西虽然很陌生,但无论做什么,都是从陌生到熟悉的过程,我们要做的事不要一看到陌生的东西就被打败,只要去做,一定可以理解很好。通过这篇博客大家认识了泛型,下一篇博客将为大家介绍存储过程和事务的使用,希望对大家有用!






1 0
原创粉丝点击