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的差别与转化的更多相关文章
- C# 将DataTable数据源转换成实体类
using System; using System.Collections.Generic; using System.Data; using System.Reflection; /// < ...
- 项目中常用方法总结(将将DataTable数据集映射到实体对象)【转】
本篇把项目中用到的一些通用方法总结出来, 这些方法因为经常需要在项目中用到,所以把它们归纳在一起, 形成一个.dll 文件是一个理想的选择. 这样也便于日后缩短开发周期. 一. 把一个DataGrid ...
- DataReader,DataTable利用泛型填充实体类
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...
- WinForm开发-界面控件到实体,实体到界面控件自动绑定
在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...
- crmsql句子的实体关系实体字段的信息窗口
在crm里面怎样用sql语句查询这些信息? 查询实体信息: --查询实体信息,实体名称:account select * from MetadataSchema.Entity where name= ...
- 权限模块_整体方案说明_设计实体&映射实体_实现初始化权限数据的功能
权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个 ...
- HTML字符实体名称/实体编号
字符实体对英文的大小写敏感! 字符实体一: 显示结果 描述 实体名称 实体编号 空格 < 小于号 < < > 大于号 > > & 和号 & ...
- 反射 DataTable拓展方法 转实体对象、实体集合、JSON
Mapper类 using System; using System.Collections.Generic; using System.Data; using System.Globalizatio ...
- (转)DataTable与结构不同实体类之间的转换
原文地址:http://www.cnblogs.com/kinger906/p/3428855.html 在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我 ...
随机推荐
- 《c程序设计语言》读书笔记-5.9-指针转换天数和日期
#include "stdio.h" #include "stdlib.h" #include "string.h" static char ...
- 3.1 Java以及Lucene的安装与配置
Lucene是Java开发的一套用于全文检索和搜索的开源程序库,它面向对象多层封装,提供了一个低耦合.与平台无关的.可进行二次开发的全文检索引擎架构,是这几年最受欢迎的信息检索程序库[1].对Luce ...
- java 复习整理(二 数据类型和几种变量)
源文件声明规则 当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则. 一个源文件中只能有一个public类 一个源文件可以有多个非public类 源文件的名 ...
- mac的vim使用
再使用Mac编辑文件时感觉非常不爽,没有语法高亮,只能通过设置改变所有字体为同一个颜色,看起来还是别扭, 于是找到方法使用vim时可以实现语法高亮显示,操作步骤如下: 1.进入/usr/share/v ...
- ldd命令【转】
转自:http://www.cnblogs.com/wanghetao/p/3779611.html ldd命令用于判断某个可执行的 binary 档案含有什么动态函式库. 参数说明: --versi ...
- 12.OpenStack镜像和存储服务配置
配置镜像服务 编辑 /etc/glance/glance-api.conf与/etc/glance/glance-registry.conf添加以下内容 [DEFAULT] notification_ ...
- flask框架基本使用(2)(响应与重定向)
#转载请留言联系 flask 框架基本使用(1):https://www.cnblogs.com/chichung/p/9756935.html 1. flask 自定义返回状态码与响应头 from ...
- jquery导出Excel表格
1.引用js插件 <script src="tableExport.js"></script> <script src="jquery.ba ...
- linux安装mongodb(设置非root用户和开机启动)
官网地址:https://www.mongodb.com/ 在官网上选择不同的linux系统得到不同的下载地址,我们用的下载地址是:https://fastdl.mongodb.org/linux/m ...
- #420 Div2 C
#420 Div2 C 题意 不断把数加入到一个栈里,取数的时候要求按照 1~n 的顺序取数,每次取数保证数一定在栈里,如果要取的数不在栈头,可以选择对栈排序一次.问最少排序几次. 分析 只要栈头的数 ...