DataTable数据转换为实体

DataTable数据转换为实体

大家好,又见面了,我是全栈君。

       我们在用三层架构编写软件时,常常会遇到例如以下问题,就是三层之间的參数传递问题:假设我们在D层查询出数据是DataTable类型的,那么我们在B层甚至U层使用这条数据时,就要用DataTable类型来回传递了,不管什么情况,我们都会不可避免的要填写读取的字段。比如我们须要使用第一条记录的的某个字段。代码须要这样写:mrc.count(*)rows(*).这样写的坏处有非常多:

        1、easy写错,而且编译器是检查不出来的;

        2、我们须要具体的了解数据库的结构;

        3、 不符合面向对象编程思想。

       这个问题研究了非常长时间,查找了无数的资料,最终找到解决方法了。将DataTable数据转化成单个的实体类。然后将这些实体类放到泛型集合中。

结果图例如以下:

 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.net/116450.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux配置ip的方法,linux下配置ip地址四种方法(图文方法)

    linux配置ip的方法,linux下配置ip地址四种方法(图文方法)主要是用第四种方法(1)Ifconfig命令第一种使用ifconfig命令配置网卡的ip地址。此命令通常用来零时的测试用,计算机启动后ip地址的配置将自动失效。具体用法如下。Ipconfigethxipaddnetmaskx.x.x.x。其中ethx中的x代表第几快以太网卡,默认第一块为0.ipadd代表ip地址。x.x.x..x为子网掩码。例如给网卡eth0配置的i…

    2022年5月2日
    52
  • html+css唯美登录页面,代码提供(效果展示)「建议收藏」

    html+css唯美登录页面,代码提供(效果展示)「建议收藏」效果图所有代码<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><metahttp-equiv=”X-UA-Compatible”content=”IE=edge”><metaname=”viewport”content=”width=device-width,initial-scale=1.0″><ti

    2022年5月23日
    41
  • 安卓模拟器打开开发者模式(USB调试)的方法

    安卓模拟器打开开发者模式(USB调试)的方法第一步:进入设置第二步:找到“关于电脑”(或者是“关于手机”)第三步:连续点击版本号字样,会有提示‘继续点击xx秒即可进入开发者模式’第四步:重新进入设置,会看到‘开发者选项’第五步:进入开发者选项,打开“USB调试”…

    2025年9月6日
    5
  • 中标麒麟正在启动caja_中标麒麟和win7差距

    中标麒麟正在启动caja_中标麒麟和win7差距1问题背景在使用UEFI安装中标麒麟系统时,出现warning:/dev/disk/by-label/NeoKylindoesnotexit如下图所示(图来源网络):2原因分析系统在DXE(DriverExecutionEnviroment)驱动加载过程中需要查找系统的启动项/启动文件,也就是waining中的:/dev/disk/by-label/NeoKylin显然,根据报错我们可知,问题就出在该启动文件的路径上–找不到对应的启动文件。3解决方法3.1确定/查看

    2022年8月10日
    96
  • WebPack_钢铁雄心4toolpack

    WebPack_钢铁雄心4toolpack关于Devtool该选项控制是否以及如何生成源映射。官网上给出的可选值有:其中一些值适合开发,一些用于生产。对于开发,您通常需要快速的SourceMaps,以bundle的大小为代价,但是对于生产,您需要独立的SourceMaps,这是精确的,并且支持最小化。选择一种源映射样式,以增强调试过程。这些值可以显著地影响构建和重建速度。而不是使用devtool选项还可以使用Sourc…

    2022年10月5日
    3
  • angular父子组件传值

    angular父子组件传值angular父子组件传值父组件到子组件1.父组件传递数据2.子组件接受数据子组件到父组件1.父组件根据ViewChild获取子组件实例2.子组件通过广播的形式,向子组件发送数据子组件操作父组件接收父组件到子组件1.父组件传递数据在父组件中调用子组件,通过[‘属性值’]进行传值//父组件app-home,子组件app-header//父组件中引用子组件,传递title及msg到子组件<app-header[title]=”title”[msg]=”msg”[run]=”run”[h

    2022年5月13日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号