机房重构——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。
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>是可选择性的技术。
这些东西虽然很陌生,但无论做什么,都是从陌生到熟悉的过程,我们要做的事不要一看到陌生的东西就被打败,只要去做,一定可以理解很好。通过这篇博客大家认识了泛型,下一篇博客将为大家介绍存储过程和事务的使用,希望对大家有用!
- 机房重构——Datatable与泛型
- 【机房重构】泛型与Datatable
- 【机房重构】-泛型与datatable
- 【机房重构】——DataTable和泛型集合
- 机房重构——泛型和“DataTable”
- 个人机房重构——DataTable与泛型的应用
- 机房重构之DataTable与泛型
- 【机房重构个人版】DataTable与泛型
- vb.net版机房重构--泛型与Datatable
- 【机房重构】——DataTable转泛型
- 机房重构——DataTable转泛型
- 机房重构——DataTable转泛型
- 【个人机房重构】——泛型集合代替DataTable
- 机房重构——透过实践看Datatable和泛型
- 机房收费系统重构——Datatable转泛型
- 机房重构——泛型 or DataTable?
- 【机房重构】DateTable与泛型
- 【机房收费系统】泛型与Datatable
- B
- 第五周项目1三角形类雏形
- 一文教你看懂POS单上的商户编号
- 实现 linux 终端上不同字体颜色显示
- SVN Access to ‘/xxx/’ forbidden,不能更新提交的解决办法
- 机房重构——Datatable与泛型
- Scala-IDE构建Maven项目
- 简单论述抽象类和接口的区别
- HTTP协议
- 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1。
- Struts2<s:select></s:select>
- 第5周-项目1-三角形类锥形(2)
- 网络属性
- 金融行业密钥详解