DataTable、DataView、DataSet 区别

DataTable、DataView、DataSet 区别 

1、DataTable数据库

DataTable 表示内存中数据的一个表,它彻底是在内存中的一个独立存在,包含了这张表的所有信息。DataTable能够是从经过链接从数据库中读取出来造成的一个 表,一旦将内容读到DataTable中,此DataTable就能够跟数据源断开而独立存在;也能够是彻底由程序本身经过代码来创建的一个表。架构

◆ DataColumnide

一个表是由行和列组成的一个两维的结构。表的结构是由DataColumn 对象的集合组成,DataColumn 对象集合可由DataTable.Columns 属性中能获取到,经过定义每一列的数据类型来肯定表的架构,相似数据库中定义表。定义完表的结构就能够根据结构来生成DataRow,用 DataTable.NewRow()方法来生成此DataTable结构的新行。函数

一个DataTable是由DataRow的集合组成的, DataRow的集合这个能够由DataTable.Rows 属性来访问。spa

DataTable还能够经过现有的列用Expression 属性的表达式建立一些列。orm

一、建立计算出的列对象

好比:已经有了一个表结构,表中有一个DataColumn的集合,其中有一个叫 UnitPrice的列,你能够新建一个DataColumn,设置好ColumnName,再设置此列的表达 式,DataColumn.Expression = "UnitPrice * 0.086",这个列的值就是名字为UnitPrice的列计算出来的,在建立表达式时,使用 ColumnName 属性来引用列。blog

二、第二个用途是建立聚合列排序

聚合列聚合一般沿着关系执行(有关关系的描述见下面DataRelation部分),若是 order表有名为 detail 的子表,两个表之间经过order.orderid和detail.orderid两个列创建一个关系 DataRelation 对象名为“order2detail”,在主表order中就能够创建一个聚合列,将计算每一个order在detail表中含有的全部item的价格的 和:DataColumn.Expression = “sum(child(order2detail).price)",child(order2detail)表示经过关系order2detail联系 到的子表,child(order2detail).price就表示子表的price列。内存

◆ DataRow

DataRow对象没有直接在代码中使用的构造函数,通常是从具备必定结构的 DataTable用NewRow()方法来新建一个DataRow对象。一个DataRow根据其是独立的,仍是属于某个DataTable,是否修改 过,是否被DataTable删除等等不一样的状况有不一样的状态,由 DataRow.RowState属性公开,以下表:

成员名称

说明

Added 该行已添加到 DataRowCollection 中,AcceptChanges 还没有调用。Deleted 该行已经过 DataRow 的 Delete 方法被删除。
Deleted 该行已经过 DataRow 的 Delete 方法被删除。
Detached 该行已被建立,但不属于任何 DataRowCollection。DataRow 在如下状况下当即处于此状态:建立以后添加到集合中以前;或从集合中移除以后。
Modified 该行已被修改,AcceptChanges 还没有调用。
Unchanged 该行自上次调用 AcceptChanges 以来还没有更改。

一个DataRow对象刚被建立以后其状态是Detached,是孤立的一个存在,因此创建了 DataRow以后在DataRow中的单元填充了数据后还要经过DataTable.Rows.Add(DataRow)方法将此DataRow添加到 DataTable,DataRow添加到 DataTable后, 这个DataRow的状态就转变为Added。当修改了这个DataRow后,这个DataRow状态转为Modified,当用 DataRow.Delete()方法删除DataRow后,DataRow状态将转为Deleted,不过此行还存在在DataTable中的,只是状 态改变了,这时用DataTable.Rows.Count查看行数,跟删除前是同样的。只有在调用了 DataTable.Remove(DataRow)方法后,此DataRow才被从DataTable移除,状态也回复到Detached孤立状态。

一旦调用了DataTable.AcceptChanges()方法后,全部的行将根据不一样的 状态作不一样的处理,Added、Modified、 Unchanged将保留当前值,Deleted的行将从DataTable中移除,最后全部的行的状态都置为Unchanged。当DataTable 是从DataAdapter.Fill(DataSet,DataTable)方法填充而造成的,Fill()方法将自动调用 AcceptChanges()方法,将DataTable的行状态都置为Unchanged。而且,若是Fill方法中指定的那个DataTable在 要填充的那个DataSet不存在时,会生成一个跟数据源表一样的结构的DataTable并填充数据。

◆ DataRelation

表示两个 DataTable 对象之间的父/子关系。能够类比于数据库中的表之间的关系,父表至关于关系列为主键的表,子表至关于关系列为外键的表。DataRelation 构造函数通常为:DataRelation(String, DataColumn, DataColumn) ,string为关系名,第一个DataColumn为创建关系的父表列,第二个DataColumn为创建关系的子表列,创建关系的两个列的 DataType 值必须相同。

创建好了关系,必须把这个关系加入到DataTable的ParentRelations属性 或ChildRelations 属性,这两个属性包含这个表的全部的跟父表的关系和跟子表的关系。若关系中此表是父表则将此关系加入到ChildRelations集合中,不然加入到 ParentRelations集合中。

2、DataView

DataView表示用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。能够将DataView同数据库的视图类比,不过有点不一样,数据库的视图能够跨表创建视图,DataView则只能对某一个 DataTable创建视图。DataView通常经过DataTable.DefaultView 属性来创建,再经过经过RowFilter 属性和RowStateFilter 属性创建这个DataTable的一个子集。

RowFilter属性用来筛选要查看DataTable中哪些行的表达式,这个表达式同上面所说的创建计算列的表达式相同。例如:"LastName = 'Smith'",这就是只查看列LastName的值为'Smith'的那些数据行。

RowStateFilter 属性用来设置 DataView 中的行状态筛选器,上面介绍DataRow时介绍了DataRow的状态,一个DataRow可能有五种状态,RowStateFilter就是能够经过 这些状态来筛选要查看的行集。其实DataRow不只有五种状态,DataRow还有版本的问题,好比当DataRow的状态为Modified,即这行 已经被修改了,这时这个DataRow就会有两个版本,Current版本和Original版本(修改前的)。实际上RowStateFilter属性 是综合了DataRow的状态和版原本筛选的(RowStateFilter确省值是CurrentRows)见下表:

成员名称

说明

Added 一个新行。
CurrentRows 包括未更改行、新行和已修改行的当前行。
Deleted 已删除的行。
ModifiedCurrent 当前版本,原始数据(请参阅 ModifiedOriginal)的修改版本。
ModifiedOriginal 原始版本(尽管它后来已被修改并以 ModifiedCurrent 形式存在)。
None 无。
OriginalRows 包括未更改行和已删除行的原始行。
Unchanged 未更改的行。

DataView.Count属性获得的计数是在应用了 RowFilter 和 RowStateFilter 以后,获取 DataView 中记录的数量。

DataView是创建在DataTable基础上的,DataView.Table 属性能够获得此DataView对应的那个DataTable。DataView的行叫DataRowView,能够从DataRowView直接经过 DataRowView.Row 属性获得此DataRowView对应的DataRow。

3、GridView

这里说的GridView是winform中的GridView,通常都是跟DataView绑定来显示DataTable中的数据,和修改DataTable中的数据。

DotNet的DataGrid的功能强大,但是在使用上与之前的习惯不太同样,有时还比较麻烦,因此不少人都对这个GridView感到有些摸不着头脑,有一种无从下手的感受,其实把一些概念搞清楚了许多问题就会迎刃而解了。

GridView经过DataSource 和 DataMember 属性来绑定其要显示的数据源。数据源通常是DataTable、DataView、DataSet等,不过将这些数据源绑定到GridView时其实是 绑定的DataView。若数据源是DataTable时,其实是绑定了此DataTable的DefaultView,若数据源是DataSet时, 则能够向 DataMember 属性设置一个字符串,该字符串指定要绑定到的表,而后再将DataMember指定的那个DataTable的DefaultView绑定到 GridView。

因此GridView实际显示的是DataTable通过筛选的DataView

相关文章
相关标签/搜索