对比DataTable和泛型
来源:互联网 发布:淘宝卖教程侵权吗 编辑:程序博客网 时间:2024/04/29 12:07
重构刚开始敲的时候一直用的是DataTable,等到了做查询余额的时候发现一个个的显示到窗体的时候很是麻烦,要知道字段在数据库中对应的位置,这样就破坏了七层的结构,使得程序的耦合性增强,在这种情况下,我们可以去使用泛型,结合着DataTable和泛型的一些基本知识,下面在说DataTable和泛型之间的区别。
Datatable是一个临时保存数据的网格,是一个虚拟表。我们在使用Datatable时,通过D层直接将数据库中的数据选出来,返回到B层和U层,在返回的时候我们要是想显示到窗体,就需要将U层的文本框与这个表中的字段一一对应。如果不小心就会写错,然后数据显示就不对。这样对数据库的耦合性太大,不能保证数据库的安全性。
泛型听起来很高深的一个词,但实际上它的作用很简单,就是提高程序的性能.比如在计算机中经常用到一些数据结构,如队列,链表等,而其中的元素以前一般这么定义:object a=new object();这样就带来一个严重的问题,用object来表示元素没有逻辑问题,但每次拆箱、封箱就占用了大量的计算机资源,导致程序性能低下,而这部分内容恰恰一般都是程序的核心部分,如果使用object,那么程序的表现就比较糟糕.而使用泛型则很好的解决这个问题,本质就是在编译阶段就告诉编译器,数据结构中元素的种类,既然编译器知道了元素的种类,自然就避免了拆箱、封箱的操作,从而显著提高c#程序的性能.比如List就直接使用string对象作为List的元素,而避免使用object对象带来的封箱、拆箱操作,从而提高程序性能。
在架构中实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。这样一来,传到B层或U层的将是一个实体类的泛型集合。使用泛型集合传递数据,编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况;你不必了解数据库结构;符合面向对象思想。
下面以查询学生余额功能来展示泛型集合的使用,因为我们在机房收费系统的时候有多个查询功能,而我们通过Sqlhelper类返回的都是DataTable,所以我们需要多次进行泛型集合的转换,为了体现代码的复用,我们将这个转换的方法抽象出单独的一个类放在D层,以供调用。
<span style="font-family:KaiTi_GB2312;font-size:18px;">'将datatable转化为泛型集合 Public Shared Function convertToList(Of Turn As {New})(ByVal table As DataTable) As IList(Of Turn) 'convertToList(Of Turn As {New}) 这里的new是用来约束T的 Dim myList As New List(Of Turn) '定义最终返回的集合 Dim myTpye As Type = GetType(Turn) '得到实体类的类型名 Dim dr As DataRow '定义行集 Dim tempName As String = String.Empty '定义一个临时变量 '遍历DataTable的所有数据行 For Each dr In table.Rows Dim myTurn As New Turn '定义一个实体类的对象 Dim propertys() As PropertyInfo = myTurn.GetType().GetProperties() '定义属性集合 Dim Pr As PropertyInfo '遍历该对象的所有属性 For Each Pr In propertys tempName = Pr.Name '将属性名称赋值给临时变量 If (table.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(myTurn, value, Nothing) '在运行期间,通过反射,动态的访问一个对象的属性 End If End If Next myList.Add(myTurn) '添加到集合 Next Return myList '返回实体集合 End Function </span>
在D层中我们每次将用table接收的数据,利用convertToList函数进行转换即可,它的含义就是遍历表中的各个属性,将表中的每一行记录作为一个对象。
<span style="font-family:KaiTi_GB2312;font-size:18px;">Dim mylist As New List(Of Entity.StudentCardEntity) Dim table As DataTable table = SqlHelper.SqlHelper.GetDataTable(sql, CommandType.Text, paras) mylist = SqlHelper.SqlHelper.convertToList(Of Entity.StudentCardEntity)(table) Return mylist </span></strong> </span>
【总结】
《夏目友人帐》中夏目说过这样一句话:“我寂寞的时候,会害怕踏出第一步,不会想到要去做什么事,所以,可能没有发觉很多很多东西”。在学习的过程中也是我们每当要学习心得知识的时候,总是想到这个会怎么怎么难,从一开始就否定了知识也否定了自己,因此,我们错过了很多学习的机会。其实知识并不可怕,可怕的是自己先觉得可怕,所以just do it!!!
0 0
- 对比DataTable和泛型
- SQL 、Array.indexOf、Linq和DataTable.Select的效率对比
- DataTable和泛型哪个好?
- DataTable与泛型
- 把IList和泛型数组转换为DataTable
- 把IList和泛型数组转换为DataTable
- 把IList和泛型数组转换为DataTable
- 【机房重构】——DataTable和泛型集合
- 【机房收费系统】——DataTable和泛型转换
- 机房重构——泛型和“DataTable”
- WPF中DataGrid数据绑定(泛型和datatable)
- 泛型转化为datatable
- DataTable 转换 泛型集合
- 泛型集合代替DataTable
- DataTable 的操作 性能的对比
- DataTable批量插入数据库 性能对比
- 机房重构——透过实践看Datatable和泛型
- VB.net版机房收费系统——Boolean、DataTable和泛型
- 递归方法产生格雷码
- [leetcode]Remove Duplicates from Sorted Array II
- Android应用界面开发_学习笔记_第四周
- 写在开头的话
- Spring Batch(5): Step详解
- 对比DataTable和泛型
- Linux下yum命令详解
- N个线程轮流打印数字问题
- JAVA多线程开发——线程的创建与运行
- mysql优化小方法
- 【操作系统】Tips(持续更新)
- APP引导页的实现
- POJ 3061 Subsequence(尺取法)
- 浅析关联引用