博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Datatable和实体还有实体集List的差别与转化
阅读量:6166 次
发布时间:2019-06-21

本文共 3801 字,大约阅读时间需要 12 分钟。

机房收费系统大家想必不是做完。就是已经在手上了,在一開始做的时候就明白规定。我们必须用实体。而不能使Datatable,由于说是Datatable直接面向了数据库,当时不是非常明白,于是也没有再深究,就去实现代码部分了。如今最终把三层的机房收费系统做完了,回过头再看的时候,有了那么一点小认识。

去年的时候,师哥师姐们用的是Datatable。也都实现了三层。在网上查了一些小Dome。也都是datatable ,于是我们就会发现这样真的有意义吗。

那么我们先来看看Datatable和Dataset吧。

在CSDN上,他说的是内存中的一张表,事实上我们也能够直接把Datatable认定为数据库中查出来的表。比方你要查学生信息,那么学生信息表在电脑上就是我们说的Datatable。而Dataset在CSDN中解释为  是数据的一种内存驻留表示形式,不管它包括的数据来自什么数据源,都会提供一致的关系编程模型。  表示整个数据集,当中包括对数据进行包括、排序和约束的表以及表间的关系。

那么我们把他理解成一个内存中的数据库吧,存放多个表的地方。也就是由多个Datatable的集合,一个小型数据库。

     也就是说我们在层与层之间用的假设是Datatable,也就是数据库中的表,可是在我们三层的实现中,我们里边的结构事实上仅仅有UI层。BLL层。DAL层,Entity层,并没有要说到的Datatable的地位,知识我们在这样查询的时候方便罢了。

但是这种话,我们的实体层貌似就没什么用了,尤其是查询的时候,我们的目的是查询东西。然后显示出来。但是假设显示的是Datatable,那么就把实体层架空了。

       然后我们再说说实体Entity和List。单个实体假设比喻成一个学生的话,那么List就是好多的学生,可是前提是都是学生。

Entity是一维的,而datatable是二维的。假设大家不明确。那就把实体理解成一条线,而Datatable理解成一张表。

实体本身也就是一些对象的详细属性的集合。把Datatable中列的属性一次在实体中体现出来。

       那么为什么要这么做呢。为什么要把查到的结果再转化一下。

我们做系统的时候当然是往好的方面做。可是我们思考的时候却要往最坏的地方去考虑:这个系统不会一次做好的。 这个系统还是要改,这个系统我须要好多人来帮我,这个系统还不完好。当我们提出来这些“坏”的考虑时。我们就会发现,假设我们返回的是Datatable,要改?怎么改,我看不到Datatable里边的信息啊,完了。还得找数据库。

假设我须要别人帮我,完了,别人也不知道Datatable里边是什么。还得看数据库,假设以后我须要改动怎么办,时间长了呀,都忘了,还得找数据库。

       那么大家是不是发现,仅仅要是修改,那么我门须要的就是数据库,把核心数据都暴露了,这怎么能够,所以我们的前辈才发明了实体这么一个东西。

       前边已经说过。我们为什么不用Datatable了。即使他在实现的时候是比較简单,可是我们还是要转化,如今我就展示一下他们是怎样转化。

       假设我们查询的是单条数据。那么就把Datatable转化到实体中。dStudent为该次转化的实体 

 '假设查询道德表的列数不为0。则把须要的查询到的列的数据传给student实体        If table.Rows.Count<> 0 Then            dStudent.Student_No = table.Rows(0).Item("Student_No")            dStudent.Student_Name =table.Rows(0).Item("Student_Name")            dStudent.Sex = table.Rows(0).Item("Sex")            dStudent.Department =table.Rows(0).Item("Department")            dStudent.Grade =table.Rows(0).Item("Grade")            dStudent.StuClass =table.Rows(0).Item("StuClass")            dStudent.IsExist =table.Rows(0).Item("IsExist")            dStudent.Charge =table.Rows(0).Item("Charge")            dStudent.Card_ID =table.Rows(0).Item("Card_ID")        End If         '返回实体Student        Return dStudent 

这样我们在以后的使用中,不管是改动,还是让别人来看,都是方便的非常多。

而List的方法也是很的方便,知识把Datatable里边的属性遍历了一边。然后在给List(T)中,当然首先加入一个方法,以后直接调用该方法。就成成功的转化。 

 Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)  '将datatable转化为泛型集合        '注意:1,convertToList(Of T As {New}) 这里的new是用来约束T的。必须有,不然new T的时候会出现错误        '2,new约束在C#和VB.NET里面的写法是不一样的,C#里面用的是where来为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 =Trim(dr(tempName).ToString)  '定义一个对象型的变量来保存列的值                     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

实现的时候我们仅仅须要加上一句

myList= EntityHelper.convertToList(Of Entity.CancelCardEntity)(table)        Return myList
实体,实体集。Datatable三者的比較,用好了。灵活性一定会得到非常大的提高,那么以后的学习中,是不是也应该考虑一下,为什么要这么做。不这么做会怎么样。

转载地址:http://ziuba.baihongyu.com/

你可能感兴趣的文章
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
查看>>
MoSQL
查看>>
Hibernate多对一外键单向关联(Annotation配置)
查看>>
《CLR via C#》读书笔记 之 方法
查看>>
设计模式:组合模式(Composite Pattern)
查看>>
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>
给PowerShell脚本传递参数
查看>>
实战2——Hadoop的日志分析
查看>>
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>