当前位置:网站首页>DataTable数据转换为实体
DataTable数据转换为实体
2022-07-07 18:44:00 【全栈程序员站长】
大家好,又见面了,我是全栈君。
我们在用三层架构编写软件时,常常会遇到例如以下问题,就是三层之间的參数传递问题:假设我们在D层查询出数据是DataTable类型的,那么我们在B层甚至U层使用这条数据时,就要用DataTable类型来回传递了,不管什么情况,我们都会不可避免的要填写读取的字段。比如我们须要使用第一条记录的的某个字段。代码须要这样写:mrc.count(*)rows(*).这样写的坏处有非常多:
1、easy写错,而且编译器是检查不出来的;
2、我们须要具体的了解数据库的结构;
3、 不符合面向对象编程思想。
这个问题研究了非常长时间,查找了无数的资料,最终找到解决方法了。将DataTable数据转化成单个的实体类。然后将这些实体类放到泛型集合中。
结果图例如以下:
实体类是数据库的映射,每一条记录相应一个实体。实体的属性相应每一条记录的字段,而且是一一相应的。我们这里是把查询到的每一条数据都作为一个实体提取出来,然后将这些实体存放到泛型集合中。这样我们在使用数据的时候仅仅要知道属性就能够,使用代码例如以下: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数据类型转换问题。其它问题不讨论,一切以如果作为前提,參考代码需慎重。
到眼下为止,这些代码攻克了我遇到的问题。可是细致思考一下。这里一个实体相应数据库的一条记录,也就是说。每个表都会有一个实体类或者泛型集合来相应,可是假设是多个表联合查询。该怎样解决呢?眼下我还没有解决问题,留待以后解决。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116450.html原文链接:https://javaforall.cn
边栏推荐
- Tensorflow2.x下如何运行1.x的代码
- Nebula importer data import practice
- 基于深度学习的目标检测的更新迭代总结(持续更新ing)
- One click deployment of any version of redis
- 【OpenCV 例程200篇】223. 特征提取之多边形拟合(cv.approxPolyDP)
- 怎样用Google APIs和Google的应用系统进行集成(1)—-Google APIs简介
- 万字总结数据存储,三大知识点
- Helix QAC 2020.2 new static test tool maximizes the coverage of standard compliance
- Intelligent software analysis platform embold
- AADL inspector fault tree safety analysis module
猜你喜欢
H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法
最新版本的CodeSonar改进了功能安全性,支持MISRA,C ++解析和可视化
使用枚举实现英文转盲文
如何满足医疗设备对安全性和保密性的双重需求?
Cantata9.0 | new features
Klocwork code static analysis tool
万字总结数据存储,三大知识点
Onespin | solve the problems of hardware Trojan horse and security trust in IC Design
写了个 Markdown 命令行小工具,希望能提高园友们发文的效率!
Intelligent software analysis platform embold
随机推荐
万字总结数据存储,三大知识点
[résolution] le paquet « xxxx» n'est pas dans goroot
[paper reading] maps: Multi-Agent Reinforcement Learning Based Portfolio Management System
Flask1.1.4 werkzeug1.0.1 source code analysis: Routing
恶魔奶爸 指南帖——简易版
CodeSonar如何帮助无人机查找软件缺陷?
Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
Écrivez une liste de sauts
C语言多角度帮助你深入理解指针(1. 字符指针2. 数组指针和 指针数组 、数组传参和指针传参3. 函数指针4. 函数指针数组5. 指向函数指针数组的指针6. 回调函数)
目标:不排斥 yaml 语法。争取快速上手
使用高斯Redis实现二级索引
如何满足医疗设备对安全性和保密性的双重需求?
Spark judges that DF is empty
嵌入式系统真正安全了吗?[ OneSpin如何为开发团队全面解决IC完整性问题 ]
The latest version of codesonar has improved functional security and supports Misra, c++ parsing and visualization
Codesonar Webinar
Implement secondary index with Gaussian redis
Dachang classic pointer written test questions
恶魔奶爸 B3 少量泛读,完成两万词汇量+
备份 TiDB 集群到持久卷