DataTable和泛型哪个好?
来源:互联网 发布:莫烦python教学网站 编辑:程序博客网 时间:2024/03/29 06:20
一开始重构的时候是用的DataTable,后来师父说要转为泛型,当初很不理解,为什么要这样呢?
DataTable和泛型哪个好?
答案是各有千秋……每一样东西都不可能是完美的,各有各的好处和缺点,如果完全能够被另外一种更先进的代替,那么这个东东就会被淘汰了。
一 、区别
①操作方便:DataTable
访问方便:EntityList
②按需索取那就是 泛型
不管什么全部取出来 就用 datatable
二、DataTable的坏处
无论是何种情况,使用DataTable不可避免的要填写读取的字段,这样做的坏处不言而喻:
⑴非常容易写错,而且编译器不检查。
⑵必须了解数据库的结构。
⑶不符合面向对象编程思想。
⑷DataTable为弱类型,无法直观的看出字段的数据类型。
三、泛型优点
实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,存放到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。
试想一下,这样一来,传到B层或U层的将是一个实体类集合,读取数据将会是如下场景:list[0].xxx;
这样做的优点如下:
⑴编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况。
⑵不必了解数据库结构。
⑶符合面向对象思想。
⑷实体类的属性是强类型,每个字段的类型都是已知的。
四、转换方法
要想从DataTable转换成泛型,很简单,首先将DataTable类型的数据全部转化为实体,将实体提取出来放到一个泛型集合中,返回这个集合,下面以一个Demo为例讲解如何使用泛型:
1、首先有一个实体转换的类来完成这个转换:
'将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 Function2、在D层中我们每次将用table接收的数据,利用convertEntityToList函数进行转换即可,它的含义就是遍历表中的各个属性,将表中的每一行记录作为一个对象。
<strong><span style="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.convertEntityToList(Of Entity.StudentCardEntity)(table) Return mylist </span></strong>
说的好像有点混乱,希望能给大家帮助!
- DataTable和泛型哪个好?
- exFAT和NTFS哪个好
- EXFAT和NTFS哪个好
- discuz和phpwind哪个好
- TIMESTAMP和DATETIME哪个好
- java和.NET哪个比较好上手?
- vb.net和c#.net哪个好
- c#和JAVA哪个好一点
- 文本搜索引擎 和 视频搜索引擎 哪个好?
- 随想:开发和测试到底哪个好?
- website和web application哪个好
- 做Android和做java哪个好
- 学习挖掘机和程序员哪个好
- AMD和英特尔CPU哪个好?
- 360和瑞星杀毒软件哪个好
- 360和瑞星杀毒软件哪个好
- 360和瑞星杀毒软件哪个好
- 360和瑞星杀毒软件哪个好
- 敏捷开发需要的是 "对" 的 "人", 而不是 "对" 的 "角色"
- HDU 4787 GRE Words Revenge 分块式在线AC自动机 2013年成都现场赛G题
- 分析访问日志一些常用的脚本
- Android studio 的工程目录结构
- Selenium2(WebDriver)总结(一)---启动浏览器、设置profile&加载插件
- DataTable和泛型哪个好?
- poj 3648 Wedding(2-SAT)
- MySQL性能调优my.cnf详解
- OOP三个基本特征:封装、继承、多态
- Throwable和Exception的区别
- Ant--项目构建
- Caused by: org.h2.jdbc.JdbcSQLException: Table "T_STUDENT_INFO" not found; SQL statement
- 查SCI、EI
- 重构——构筑强健测试体系