Datatable和实体还有实体集List的区别与转化

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

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

那么我们先来看看Datatable和Dataset吧。在CSDN上,他说的是内存中的一张表,其实我们也可以直接把Datatable认定为数据库中查出来的表,比如你要查学生信息,那么学生信息表在电脑上就是我们说的Datatable。而Dataset在CSDN中解释为 DataSet 是数据的一种内存驻留表示形式,无论它包含的数据来自什么数据源,都会提供一致的关系编程模型。 DataSet 表示整个数据集,其中包含对数据进行包含、排序和约束的表以及表间的关系。那么我们把他理解成一个内存中的数据库吧,存放多个表的地方,也就是由多个Datatable的集合,一个小型数据库。

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

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

然后我们再说说实体Entity和List,单个实体如果比喻成一个学生的话,那么List就是好多的学生,但是前提是都是学生。Entity是一维的,而datatable是二维的,如果大家不明白,那就把实体理解成一条线,而Datatable理解成一张表。实体本身也就是一些对象的具体属性的集合。把Datatable中列的属性一次在实体中体现出来。

那么为什么要这么做呢,为什么要把查到的结果再转化一下。我们做系统的时候当然是往好的方面做,但是我们思考的时候却要往最坏的地方去考虑:这个系统不会一次做好的, 这个系统还是要改,这个系统我需要好多人来帮我,这个系统还不完善,当我们提出来这些“坏”的考虑时,我们就会发现,如果我们返回的是Datatable,要改?怎么改,我看不到Datatable里边的信息啊,完了,还得找数据库。如果我需要别人帮我,完了,别人也不知道Datatable里边是什么,还得看数据库,如果以后我需要修改怎么办,时间长了呀,都忘了,还得找数据库。

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

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

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

<span style="font-size:14px;"><span style="font-size:14px;"> '如果查询道德表的列数不为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
 </span></span>

这样我们在以后的使用中,无论是修改,还是让别人来看,都是方便的很多。

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

<span style="font-size:14px;"><span style="font-size:14px;"> 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</span></span>

实现的时候我们只需要加上一句

<span style="font-size:14px;"><span style="font-size:14px;">myList= EntityHelper.convertToList(Of Entity.CancelCardEntity)(table)
        Return myList</span></span>

实体,实体集,Datatable三者的比较,用好了,灵活性一定会得到很大的提高,那么以后的学习中,是不是也应该考虑一下,为什么要这么做,不这么做会怎么样。

Datatable和实体还有实体集List的区别与转化

时间: 2024-10-10 17:05:52

Datatable和实体还有实体集List的区别与转化的相关文章

Datatable和实体还有实体集List的差别与转化

机房收费系统大家想必不是做完.就是已经在手上了,在一開始做的时候就明白规定.我们必须用实体.而不能使Datatable,由于说是Datatable直接面向了数据库,当时不是非常明白,于是也没有再深究,就去实现代码部分了.如今最终把三层的机房收费系统做完了,回过头再看的时候,有了那么一点小认识. 去年的时候,师哥师姐们用的是Datatable.也都实现了三层.在网上查了一些小Dome.也都是datatable ,于是我们就会发现这样真的有意义吗. 那么我们先来看看Datatable和Dataset

实体、实体集及其运用

一.实体 实体 在C#中的写法 在C#中 写法(1): public class UserInfo { public int UserID { get; set; } } 写法(2): public class UserinfoEntity { private string userid; '定义字段名 public string ID '定义属性项 { get{return userid;} '取值[Get--End Get,是可省的] set{userid = value;} '赋值[Set

C# 将DataTable数据源转换成实体类

1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Reflection; 5 6 /// <summary> 7 /// 将DataTable数据源转换成实体类 8 /// </summary> 9 /// <typeparam name="T">实体</typeparam> 10 public static cl

自定义ORMapping—关系表转换为实体或实体集合对象

概述 ORMapping,中文翻译过来就是,关系对象的映射,他的作用就是使我们编程时,不用过多的关注持久层,只需要关注对象,关注业务就可以了.ORMapping主要完成两个功能:自动生成SQL语句和DataTable To Objects. 特性和反射 特性是用来描述元数据的,元数据就是源代码编译好后的代码.反射是运行时,获得对象或类的所有信息,通过这些信息,我们可以创建类获得特性信息等等 关系表转换为实体或实体集合对象的实现方式 对于关系表转换为实体或实体集合对象的实现方法可以有多种,这里说一

WinForm开发-界面控件到实体,实体到界面控件自动绑定

在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动映射了呢?现在不用如此繁琐,在RDIFramework.NET开发框架的WinForm部分新增了界面控件到实体,实体到界面控件自动绑定,一句话就搞定了,非常的方便.主要是引用“RDIFramework.WinForm.Utilities.dll”dll文件,再调用下面两个方法即可: 1.实体到界面控

crmsql语句查询实体窗体实体字段关系信息

在crm里面如何用sql语句查询这些信息? 查询实体信息: --查询实体信息,实体名称:account select * from MetadataSchema.Entity where name= 'account' 查询窗体信息: --查询窗体信息,ObjectTypeCode: 实体的code select * from systemform where ObjectTypeCode = 1 查询视图信息: --查询视图信息,ReturnedTypeCode:实体的code select

权限模块_整体方案说明_设计实体&amp;映射实体_实现初始化权限数据的功能

权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个URL. 2,例如添加或修改功能,对应两个URL:..add, ..addUI 权限模型 权限方案: 用户 *----* 角色 *----* 权限 与权限相关的功能具体有哪些: 初始化数据:... 分配权限:... 使用权限:... 具体有哪些功能 初始化数据(安装) 权限数据. 超级管理员. 分配

EF6基础系列(十)---离线场景保存实体和实体图集

离线场景保存和删除实体/实体图集 这一节的内容是在离线场景中保存实体和实体图集 在离线场景中,当我们保存一个离线的实体图集或一个单独的离线实体时,我们需要做两件事.首先,我们要把实体附加到新的上下文中,让上下文了知道存在这些实体.其次,我们需要手动设置每个实体的EntityState,因为新的上下文不知道这些离线实体都经过了些什么操作,所以新的上下文不能自动地给实体添加EntityState.上一节我们清楚了附加离线图集的方法,附加离线图集时默认添加的EntityState不一定合适,所以我们就

实体与实体之间的联系

单张表的缺点: 表的结构不清晰 造成数据冗余 表的可扩展性差 一.外键 一个表的的主码的在另一张表中出现充当非主码字段(Foreign Key) 表与表之间用外码进行连接 外键虽然能够帮你强制建立表关系 但是也会给表之间增加数据相关的约束,通过cascade可以进行级联更新 外键约束 1.在创建表的时候 必须先创建被关联表 2.插入数据的时候 必须先插入被关联表的数据 二.实体与实体之间的关系 一对一关系 外键字段放在使用频率高的表上 一对多关系 外键字段放在多的一方 多对多关系 建在关系表中