DataTable数据转换为实体
我们在用三层架构编写软件时,常常会遇到例如以下问题,就是三层之间的參数传递问题:假设我们在D层查询出数据是DataTable类型的,那么我们在B层甚至U层使用这条数据时,就要用DataTable类型来回传递了,不管什么情况,我们都会不可避免的要填写读取的字段。比如我们须要使用第一条记录的的某个字段。代码须要这样写:mrc.count(*)rows(*).这样写的坏处有非常多:
1、easy写错,而且编译器是检查不出来的;
2、我们须要具体的了解数据库的结构;
3、 不符合面向对象编程思想。
这个问题研究了非常长时间,查找了无数的资料,最终找到解决方法了。将DataTable数据转化成单个的实体类。然后将这些实体类放到泛型集合中。
结果图例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDk0MjQ2NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
实体类是数据库的映射,每一条记录相应一个实体。实体的属性相应每一条记录的字段,而且是一一相应的。我们这里是把查询到的每一条数据都作为一个实体提取出来,然后将这些实体存放到泛型集合中。这样我们在使用数据的时候仅仅要知道属性就能够,使用代码例如以下:List.(items).property。这样。是不是简化了代码,降低了工作量,也降低了错误率。
那么。是怎样用代码实现的呢?首先是实体类,这里,我们如果数据库中仅仅有两个字段用户民和password:
Public Class User
Public UserName As String
Public PassWord As String
Public Property _username() As String
Get
Return UserName
End Get
Set(value As String)
UserName = value
End Set
End Property
Public Property _password() As String
Get
Return PassWord
End Get
Set(value As String)
PassWord = value
End Set
End Property
End Class
这里。我是用了一个ModelHelper类来实现这个功能。由于这是关于參数的类,将这个类放到了Model层。代码例如以下:
Imports System.Collections.Generic '命名空间
Imports System.Reflection '引入反射:便于使用propertyInfo
''' <summary>
''' 实体转换类。此类用于将数据表格转换为实体集合
''' </summary>
''' <remarks></remarks>
Public Class ModeHelper
Public Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
'将dataTable转化为泛型集合
'1convertToList(Of T As {New})这里的new是用来约束參数T的。否则实例化时回出现错误
'2List后边的參数总是(of +)类型
Dim myList As New List(Of T) '定义返回值集合
Dim myType As Type = GetType(T) '定义实体类类型名
Dim dr As DataRow '定义行集 Dim tempName As String = String.Empty '定义一个暂时变量,用来存放
'数据表总是一个二维表格,须要使用数组:dr和pr,dt表示sqlhelper返回结果
For Each dr In dt.Rows '遍历DataTable全部记录
Dim myT As New T '定义一个实体对象
Dim Propertys() As PropertyInfo = myT.GetType().GetProperties() '定义属性集合,获得公共属性
Dim pr As PropertyInfo
For Each pr In Propertys '遍历DataTable全部字段
tempName = pr.Name '将属性名赋值给暂时变量
'检查Datatable是否包括此列(列名==对象属性名)
If (dt.Columns.Contains(tempName)) Then '将此属性与datatable的列名比較,查看datatable是否包括此列
If (pr.CanWrite = False) Then '推断此属性是否有Setter
Continue For '继续执行
End If
Dim value As Object = dr(tempName) '定义一个对象性的变量来保存列的值
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
End Class
下边是D层的调用代码:
Public Function SelectUsers1(user ) As List(Of Charge.Model.User)
Dim mrc as dataTable '如果mrc是从数据库中查询出来的DataTable数据表
Dim myList As List(Of Charge.Model.User) '定义一个集合用来返回转化后的实体集合
Dim mHelper As New Charge.Model.ModeHelper '实例化一个实体转换类
myList = mHelper.convertToList(Of Charge.Model.User)(mrc) '调用实体转换类的方法,转换数据
Return myList '返回结果
End Function
在这里,我们仅仅讨论将DataTable数据类型转换问题。其它问题不讨论,一切以如果作为前提,參考代码需慎重。
到眼下为止,这些代码攻克了我遇到的问题。可是细致思考一下。这里一个实体相应数据库的一条记录,也就是说。每个表都会有一个实体类或者泛型集合来相应,可是假设是多个表联合查询。该怎样解决呢?眼下我还没有解决问题,留待以后解决。
DataTable数据转换为实体的更多相关文章
- 把dataTable数据转换为Html
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...
- android开发学习 ------- json数据与实体类之间的相互转换
在网络请求的时候,会返回给我们实体类,我们需要将实体类转化为json字符串,方便处理数据: 有时候也会将json数据转换为实体类. 在Android Studio中,json要互相转换,需要用到gso ...
- 三层架构中bll层把datatable转换为实体model的理解
看了很多人的项目,很多都是用到三层架构,其中BLL层中有一种将DataTable转换为实体的方法.一直没有明白为啥要这样做,今天特意去搜索了一下,如果没有答案我是准备提问,寻求解答了.还好找到一个相关 ...
- 通过表达式树把datareader和datatable转换为实体
续上两篇文章,使用emit构造dynamic method,把 datareader转换为实体,以避免直接使用反射来实现带来的性能损失.代码看似没有纰漏,但是实际上我在framwork4下运行时,调用 ...
- 项目中常用方法总结(将将DataTable数据集映射到实体对象)【转】
本篇把项目中用到的一些通用方法总结出来, 这些方法因为经常需要在项目中用到,所以把它们归纳在一起, 形成一个.dll 文件是一个理想的选择. 这样也便于日后缩短开发周期. 一. 把一个DataGrid ...
- .net c#将数据库数据对象转换为实体值对象
using System; using System.Data; namespace Sunlib { public static class DataHelper { //将数据库数据对象转换为实体 ...
- 【数据传输 2】批量导入的前奏:将Excel表中的数据转换为DataTable类型
导读:我们知道,在数据库中,数据集DataSet是由多张DataTable表组成.所以,如果我们需要将数据从外部导入到数据库中,那么要做的很重要的一步是将这些数据转换为数据库可以接受的结构.今天在用S ...
- DataTable转换成实体
public static class DataTableToEntity { /// <summary> /// 将DataTable数据源转换成实体类 /// </summary ...
- DataSet转换为实体类
/// <summary> /// DataSet转换为实体类 /// </summary> /// <typeparam name="T">实 ...
随机推荐
- [置顶] Windows Phone后台音乐详解一
应用于: Windows Phone 8 | Windows PhoneOS 7.1 你可以为winphone编写在后台播放音乐的app.这表示即使当用户点击返回或开始按钮离开你的应用界面时,你的应用 ...
- Stack栈的三种含义
理解stack栈对于理解程序的执行至关重要.easy混淆的是,这个词事实上有三种含义,适用于不同的场合,必须加以区分. 含义一:数据结构 stack的第一种含义是一组数据的存放方式,特点为LIFO,即 ...
- Androidclient与服务端(jsp)之间json的传输与解析【附效果图附源代码】
近期有个项目须要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,能够实现基本功能:androidclient发送json到服务端,服务端使用jsp接收,解析后以jso ...
- 七牛用户如何将视频转码成普清高清来适应不同的手机端或者web端
Qiniu 七牛问题解答 非常多人会用到七牛视频转码问题,要将视频转码成适用于各种终端的视频,也有的用户对转码服务的码率,帧率,分辨率等理解不多.不知道该怎样设置这些參数.以下我给大家科普一下. 问题 ...
- (1)前言——(10)jquery项目的历史(History of the jQuery project)
This book covers the functionality and syntax of jQuery 1.6.x, the latest version at the time of wri ...
- EL表达式(3)
本篇讲解使用EL表达式来调用Java方法(自定义EL函数)和Sun公司开发的EL函数库. 简单来说,我们在一个类中的某个方法,可以使用EL进行调用,这个能被EL表达式调用的方法称之为EL函数,但是这种 ...
- [SVN] 分支同步、合入主干操作分享
冲突的解决原则 不是自己修改的地方就使用主干的. 需要特别注意的是: 分支同步主干时,远端(theirs)是主干,本地(mine/working)的是分支: 分支合入主干时,本地(mine/worki ...
- 让Delphi XE2程序支持UAC
在win7下,开发的程序有的时候莫名其妙就不能正常工作了,其实都是因为权限不够,要想能够正常运行,就需要获得管理员权限,这就需要处理UAC.具体方法如下: 一,制作“uac.manifest”文件.新 ...
- Mongdb 访问
http://114.55.75.xx/pics/201607040751367d21a38035bd4da7abd4473783f85f7a
- c语言指针具体解释
指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最基本的风格之中的一个.利用指针变量能够表示各种数据结构: 能非常方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高 ...