DataView和DataTable的区别、联系、以及相互转化方法
一、定义区别
-
DataTable:表示内存中数据的一个表,它完全是在内存中的一个独立存在,包含了这张表的全部信息。
建立方式
①通过连接数据库后从中读取出来跟数据源断开、独立存在的一个表;
②完全由程序通过代码来建立的一个表。 -
DataView:表示用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。
-
DataRowView:表示
通过DataRowView.Row 属性得到此DataRowView对应的DataRow
可以将DataView同数据库的视图类比,不过二者存在以下区别。
| DataView | 视图 |
|---|---|
| 只能对某一个DataTable建立视图 | 可以跨表建立视图 |
| 通过DataTable.DefaultView属性来建立,通过DataTable.DefaultView的RowFilter 属性和RowStateFilter 属性筛选这个DataTable的一个行子集。 |
二、相互联系
| DataView | DataTable |
|---|---|
| 建立在DataTable基础上 | |
| DataView.Table 属性可以得到此DataView对应的DataTable | |
| DataView dv = dt.DefaultView; | DataTable dt = dv.ToTable(); |
DataView的toTable和Table
| toTable | Table |
|---|---|
| 方法 | 属性 |
| 通过RowFilter等过滤后的数据创建新实例 | 返回原始数据 |
| 会对DataView本身的数据产生影响 | 不会对DataView本身的数据产生影响 |
三、相互转化
1.dataTable转成dataview
方法一:
if ((dt == null) || ((dt.Rows).Count < 1)) return; IEnumerable dv = (IEnumerable)((IListSource)dt).GetList();//将datatable转成dataview foreach (Object o in dv) { PropertyDescriptorCollection propDesColl = TypeDescriptor.GetProperties(o); foreach (PropertyDescriptor pd in propDesColl) { Type type = pd.PropertyType; } } 方法二:
IEnumerable dv = (IEnumerable)((IListSource)dt).GetList(); 2.将DataView转换为DataTable
(1).DataView.ToTable()
根据现有DataView中的行,创建并返回一个新的DataTable。
(2).DataView.ToTable(String)
参数String为返回的DataTable的名称。
注意:输出的表与输入表的列相同,不可自定义。
(3).DataView.ToTable(Boolean,String[]) || DataView.ToTable(Boolean,String[],String[],…)
参数Boolean为true,去重;为false,不去重。
数组String[]为显示返回列值的集合。去重是针对String去重的。
注意:参数Boolean且默认为false;可自定义返回的列。
DataView dv = new DataView(table);//table是DataTable类型的对象 table = dv.ToTable(true,"ID");//去重,且只返回ID列 (4).DataView.ToTable(String,Boolean,String[])
根据现有DataView中的行,创建并返回一个新的DataTable。比3多一个参数,可以定义返回表的名称。