三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)

用三层架构开发项目,经常会遇到如下场景:      D层负责与数据库交互,一般是得到DataTable或DataSet对象,然后返回给B层,B层进行类似的处理来读取数据:dt.Rows[0][“xxx”];或者dt.Rows[0][1];(强烈不建议使用)。      有时DataTable也会被传到UI层,与控件进行绑定,显示数据。例如ASP.NET的repeater控件提取数据:。
摘要由CSDN通过智能技术生成

      用三层架构开发项目,经常会遇到如下场景:

      D层负责与数据库交互,一般是得到DataTable或DataSet对象,然后返回给B层,B层进行类似的处理来读取数据:dt.Rows[0][“xxx”];或者dt.Rows[0][1];(强烈不建议使用)。

      有时DataTable也会被传到UI层,与控件进行绑定,显示数据。例如ASP.NET的repeater控件提取数据:<%# Eval(“xxx”)%>。

      无论是何种情况,使用DataTable不可避免的要填写读取的字段,这样做的坏处不言而喻:

      |  非常容易写错,而且编译器不检查。

      |  必须了解数据库的结构。

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

      |  DataTable为弱类型,无法直观的看出字段的数据类型。

      这个问题一直困扰着我,这次借着重构机房收费系统的机会,研究了一下这个问题,找到了一种比较好的解决方案:在D层把DataTable转换成单个实体类,再把实体类填充到泛型集合中。


核心思想如图:



      实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,存放到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。

      试想一下,这样一来,传到B层或U层的将是一个实体类集合,读取数据将会是如下场景:list[0].xxx;

      这样做的优点如下:

      |  编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况。

      |  不必了解数据库结构。

      |  符合面向对象思想。

      |  实体类的属性是强类型,每个字段的类型都是已知的。

 

      那么用代码如何实现呢?下面一一列举。

      注意:以下代码仅仅是为了模拟,有些不规范的地方,代码注释中有提示,切勿模仿!

 

实体类代码:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Entity
{
    /// <summary>
    /// Users表实体类
    /// </summary>
    public class Users
    {
        private long _id;
        private string _userName;
        private string _passWord;

        public long id 
        {
            set {_id = value; }
            get { return _id; }
        }

        public string userName 
        {
            set { _userName = value; }
            get { return _userName; }
        }

        public string passWord 
        {
            set { _passWord = value; }
            get { return _passWord; }
        }
    }
}


将DataTable转换成List<T>泛型集合助手类,这个类我放在了Entity实体类层中:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;

namespace Entity
{
    /// <summary>
    /// 将DataTable转换成泛型集合IList<>助手类
    /// </summary>
    public class ConvertHelper
    {
        /// <summary>
        /// 单表查询结果转换成泛型集合
        /// </summary>
        /// <typeparam name="T">泛型集合类型</typeparam>
        /// <param name="dt">查询结果DataTable</param>
        /// <returns>以实体类为元素的泛型集合</returns>
        public static IList<T> convertToList<T>(DataTable dt) where T : new()
        {
            // 定义集合
            List<T> ts = new List<T>();

            // 获得此模型的类型
            Type type = typeof(T);
            //定义一个临时变量
          
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值