您的位置:首页 > 编程语言 > C#

C#中将DataTable类型转化为泛型集合

2017-12-09 14:35 246 查看
DataTable是什么?
DataTable 是一个临时保存数据的网格虚拟表(表示内存中数据的一个表。)。DataTable是ADO dot net库中的核心对象。它可以被应用在 VB 和 ASP 上。它无须代码就可以简单的绑定数据库。它具有微软风格的用户界面。
 
注意!!!

当访问DataTable对象时,请注意它们是按条件区分大小写的。例如,如果一个DataTable被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。一个DataSet可以包含数个DataTable对象,它们具有相同的TableName属性值和不同的Namespace属性值。有关使用DataTable对象的更多信息。
 
 
DataTable的作用是什么?
 
在机房重构的时候我们都会将数据库的数据读取出来,经常使用的是就是DataTable数据类型,将数据库中表的信息读取出来,存在临时数据表中,即DataTable表,然后将在其他层中需要数据传参的就直接将方法定义为DataTable类型的(除非有特殊要求)。而另一种存储数据的方式就泛型集合,将DataTable转换成泛型,然后通过泛型再去传递数据。
       
       DataTable的数据改动需要根据数据库表中的信息操作,例如,如果我想将数据库某表的某个新字段读取出来,那么用DataTable需要重新查看数据库,然后间接就将数据库中的信息暴露了,除非是同一个人操作,不过那样不灵活了。
 
泛型是什么?
       泛型是具有占位符(类型参数)的类、结构、接口和方
法,这些占位     
符是类、结构、接口和方法存储或者使用的一个或多个类型的占位符。
 
泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型或其方法的参数类型出现。泛型的方法还可以将参数类型用作返回值类型或者某个形参的类型。
     

泛型集合其实就是一个个的实体类集合,我们在没有接触这个概念前,数据库访问返回的类型有实体、DataTable、Boolean。下面是画了几张示意图:

 

 

 
 
 
使用泛型的好处?
如果不用泛型集合,你要是查询有多少个用户的时候(添加删除用户),单个实体和Boolean肯定是不行的,DataTable倒是可以,但是它因为高耦合(一个用户信息变化,就得修改DataTable),使系统运行的性能会不好.

 
 
 
 
如何DataTable类型转化为泛型集合?
  public List<T>ConvertToList<T>(DataTable dt) where T : new()
        {
            //初始化,获得类型,string类型变量
            List<T> ts = newList<T>();
            //获得此类型的模型
            Type type = typeof(T);
            String tempName = "";
 
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                //获得此模型的公共属性
                PropertyInfo[] propertys =t.GetType().GetProperties();
                //foreach(类型 要用的变量名称 in之前声明的变量名称)
                foreach (PropertyInfo pi inpropertys)
                {
                    tempName = pi.Name;
                    //检查DataTable是否包含此列
                    if(dt.Columns.Contains(tempName))
                    {
                        // 判断此属性是否有Setter
                        if (!pi.CanWrite)continue;
                        object value =dr[tempName];
                        if (value !=DBNull.Value)
                            pi.SetValue(t,value, null);
                    }
                }
                ts.Add(t);
            }
 
            return ts;
        }
 
 
但是没理解他们到底有什么不同,及时不用泛型,我也可以将数据源存到DataTable,然后方法返回值也定义为DataTable型,请高手指点!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐