如何对DataSet进行强类型化

在项目中经常需要用到DataSet来存放数据,但是一直觉得从数据集中获取数据使用是一件很难受的事情,特别是当需要用到强类型数据的时候,就想到了动手写个方法来实现。

  1. /// <summary>    
  2.     /// 将数据集强类型化    
  3.     /// </summary>    
  4.     /// <typeparam name="T">转换类型</typeparam>    
  5.     /// <param name="dataSet">数据源</param>    
  6.     /// <param name="tableIndex">需要转换表的索引</param>    
  7.     /// <returns>泛型集合</returns>    
  8.     public static IList<T> ToList<T>(this DataSet dataSet, int tableIndex)    
  9.      {    
  10.          //确认参数有效    
  11.          if (dataSet == null || dataSet.Tables.Count <= 0 || tableIndex < 0)    
  12.              return null;    
  13.          DataTable dt = dataSet.Tables[tableIndex];    
  14.          IList<T> list = new List<T>();    
  15.          for (int i = 0; i < dt.Rows.Count; i++)    
  16.          {    
  17.               //创建泛型对象    
  18.               T _t = Activator.CreateInstance<T>();    
  19.               //获取对象所有属性    
  20.               PropertyInfo[] propertyInfo = _t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);    
  21.               for (int j = 0; j < dt.Columns.Count; j++)    
  22.               {    
  23.                   foreach (PropertyInfo info in propertyInfo)    
  24.                   {    
  25.                       //属性名称和列名相同时赋值    
  26.                       if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))    
  27.                       {    
  28.                           if (dt.Rows[i][j] != DBNull.Value)    
  29.                           {    
  30.                               info.SetValue(_t, dt.Rows[i][j].ConvertDataTo(info.PropertyType), null);    
  31.                           }    
  32.                           else   
  33.                           {    
  34.                               info.SetValue(_t, null, null);    
  35.                           }    
  36.                           break;    
  37.                       }    
  38.                   }    
  39.               }    
  40.               list.Add(_t);    
  41.          }    
  42.          return list;    
  43.      }  

在需要给属性赋值的时候,为了避免数据集中的字段名与用户定义的Model属性名一致而类型不一致的问题,我又写了个方法,用来把对象进行类型转换:

  1. public static object ConvertDataTo(this object obj,Type type)     
  2. {    
  3.     if (obj.GetType().Equals(type))    
  4.     {    
  5.         return obj;    
  6.     }    
  7.     else   
  8.     {    
  9.         try   
  10.         {    
  11.             if (type == typeof(string)) { return obj.ToString(); }    
  12.             MethodInfo parseMethod = null;    
  13.             foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static | BindingFlags.Public))    
  14.             {    
  15.                 if (mi.Name == "Parse" && mi.GetParameters().Length == 1)    
  16.                 { parseMethod = mi; break; }    
  17.             }    
  18.             if (parseMethod == null)    
  19.             {    
  20.                 return null;    
  21.             }    
  22.             return parseMethod.Invoke(null, new object[] { obj });     
  23.         }    
  24.         catch    
  25.         {    
  26.             return null;    
  27.             throw;    
  28.         }    
  29.     }    
  30. }  

其实这么写是比较偷懒的写法,用了这么多反射, 于是想到做一下性能测试,我建的MVC项目,看一下测试结果:

  1. public ActionResult Index()    
  2.      {    
  3.          DataSet ds = new DataSet();    
  4.          DataTable dt = new DataTable();    
  5.          dt.Columns.Add("resourcename1", typeof(string));    
  6.          dt.Columns.Add("resourcename2", typeof(string));    
  7.          dt.Columns.Add("resourcename3", typeof(string));    
  8.          dt.Columns.Add("resourcename4", typeof(string));    
  9.          dt.Columns.Add("resourcename5", typeof(string));    
  10.          dt.Columns.Add("fitsex1", typeof(int));    
  11.          dt.Columns.Add("fitsex2", typeof(int));    
  12.          dt.Columns.Add("fitsex3", typeof(int));    
  13.          dt.Columns.Add("fitsex4", typeof(int));    
  14.          dt.Columns.Add("fitsex5", typeof(int));    
  15.          for (int i = 0; i < 5000; i++)    
  16.          {    
  17.               DataRow row = dt.NewRow();    
  18.               row[0] = "王虎" + i.ToString();    
  19.               row[1] = "王虎" + i.ToString();    
  20.               row[2] = "王虎" + i.ToString();    
  21.               row[3] = "王虎" + i.ToString();    
  22.               row[4] = "王虎" + i.ToString();    
  23.               row[5] = i;    
  24.               row[6] = i;    
  25.               row[7] = i;    
  26.               row[8] = i;    
  27.               row[9] = i;    
  28.               dt.Rows.Add(row);    
  29.           }    
  30.           ds.Tables.Add(dt);    
  31.           var watch = new Stopwatch();    
  32.           watch.Start();    
  33.           var ModelList = ds.ToList<Model_Resource>(0);    
  34.           watch.Stop();    
  35.           ViewData["Message"] = string.Format("ModelList.count={0},Elapsed Milliseconds:{1}", ModelList.Count.ToString(),watch.ElapsedMilliseconds.ToString());    
  36.           return View();    
  37.      }  

我使用的类定义如下:

  1. /// <summary>    
  2.   /// 实体类Resource 。(属性说明自动提取数据库字段的描述信息)    
  3.   /// </summary>    
  4.   [Serializable]    
  5.   public class Model_Resource    
  6.   {    
  7.       public Model_Resource()    
  8.       { }    
  9.       #region Model    
  10.       /// <summary>    
  11.       /// 资源标准名称    
  12.       /// </summary>    
  13.       public string ResourceName1    
  14.       {    
  15.           get;    
  16.           set;    
  17.       }    
  18.       /// <summary>    
  19.       /// 资源标准名称    
  20.       /// </summary>    
  21.       public string ResourceName2    
  22.       {    
  23.           get;    
  24.           set;    
  25.       }    
  26.       /// <summary>    
  27.       /// 资源标准名称    
  28.       /// </summary>    
  29.       public string ResourceName3    
  30.       {    
  31.           get;    
  32.           set;    
  33.       }    
  34.       /// <summary>    
  35.       /// 资源标准名称    
  36.       /// </summary>    
  37.       public string ResourceName4    
  38.       {    
  39.           get;    
  40.           set;    
  41.       }    
  42.       /// <summary>    
  43.       /// 资源标准名称    
  44.       /// </summary>    
  45.       public string ResourceName5    
  46.       {    
  47.           get;    
  48.           set;    
  49.       }    
  50.       /// <summary>    
  51.       /// 适合的性别 1 男 2 女 3 均可    
  52.       /// </summary>    
  53.       public string FitSex1    
  54.       {    
  55.           get;    
  56.           set;    
  57.       }    
  58.       /// <summary>    
  59.       /// 适合的性别 1 男 2 女 3 均可    
  60.       /// </summary>    
  61.       public string FitSex2    
  62.       {    
  63.           get;    
  64.           set;    
  65.       }    
  66.       /// <summary>    
  67.       /// 适合的性别 1 男 2 女 3 均可    
  68.       /// </summary>    
  69.       public string FitSex3    
  70.       {    
  71.           get;    
  72.           set;    
  73.       }    
  74.       /// <summary>    
  75.       /// 适合的性别 1 男 2 女 3 均可    
  76.       /// </summary>    
  77.       public string FitSex4    
  78.       {    
  79.           get;    
  80.           set;    
  81.       }    
  82.       /// <summary>    
  83.       /// 适合的性别 1 男 2 女 3 均可    
  84.       /// </summary>    
  85.       public string FitSex5    
  86.       {    
  87.           get;    
  88.           set;    
  89.       }    
  90.       #endregion Model    
  91.   }  

看一下测试结果:

注:

性能上还可以通过缓存等机制优化一下,不过这方面已经有一些大牛做过了,以后有时间可以加进去。

原文链接:http://www.cnblogs.com/wbpmrck/archive/2011/04/12/2013730.html

【编辑推荐】

  1. 一步一步设计你的数据库1
  2. 为自己做一个简单记账簿
  3. 晒晒我的通用数据访问层
  4. 几步走,教你创建简单访问数据库方法
  5. 微软研究人员:NoSQL需要标准化

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/289044.html<

(0)
管理的头像管理
上一篇2025-05-16 14:50
下一篇 2025-05-16 14:51

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

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