C#dataTable,dataView和Dataset三者的区别
1、DataView是DataTable的表⽰,DataTable表⾥的记录是没有顺序的,但显⽰可以有不同顺序(DataVIew),
但还是同⼀张表,所以⼀个DataTable可以有多个DataView,默认访问DataTable,其实是访问他的
DefaultView。DataSet则是DataTable的集合,也可以有不⽌⼀个DataTable
2、DataView  是⼀张DataTable的虚拟视图,主要⽤来显⽰数据的,其实数据的更改都是发⽣在DataTable中。
datasource是什么意思如果以数据库来打⽐⽅,DataSet就是⼀个功能简单的数据库,是多个表(DataTable)的集合,DataTable就是对应数
据库中的表,⽽DataView则对应数据库中的视图(View)。
ADO.NET中有⼀层对象,⽤来创建任意数据源的抽象模型。其中包括DataSet,DataTable,DataRow,DataView,DataRelation等等。所有这些对象都定义在System.Data名字空间。它们形成⼀个抽象模型,使得⽆论针对Windows Form,Web Form还是Web Service进⾏编程,都可以使⽤相同的编程接⼝。
在实际应⽤中,这些对象⼤多会对诸如SQL Server⼀类的关系型数据库中的数据进⾏操作。但是,它们可以处理各种数据,⽽不管它的物理存储媒介。
你可以使⽤DataSet对象来打包和关联各表中的数据,⽤DataTable类来处理表格类型的数据,⽽DataRow对象可以处理表中某⼀⾏的数据。
这三个对象都是对数据进⾏打包,但有不同的逻辑聚合层次。DataSet是DataTable和其他的组合。⽽DataTable是DataRow和其他的组合。DataRow是字段和其他的组合。但是这些对象中都没有内建过滤和排序的功能。
ADO.NET提供了⼀些类来处理这个数据库应⽤程序中的重要⽅⾯。在.Net Beta2中,这⽅⾯最重要的两个对象就
是DataView和DataViewManager。
注意:DataViewManager是Beta2中特有的。在Beta1中,相应的功能由DataSetView完成。
定制数据视图
DataView类⽤来表⽰定制的DataTable的视图。DataTable和DataView的关系是遵循著名的设计模式--⽂档/视图模式,其中DataTable是⽂档,⽽Dataview是视图。
在任何时候,你都可以有多个基于相同数据的不同的视图。更重要的是,你可以对每⼀个具有⾃⼰⼀套属性、⽅法、事件的视图作为独⽴的对象进⾏处理。这也代表了相对ADO⼀个巨⼤的飞跃。
ADO Recordset可以定义过滤字符串。⼀旦你建⽴了该字符窜,只有匹配特定标准的数据才能够进⾏读写。Filter属性的⼯作原理同动
态WHERE⼦句很相似。它只是简单的在同⼀recordset对象视图上隐藏了某些记录。
在ADO中,你从没有⼀个独⽴的视图对象。⼀个过滤过的recordset总是同⼀个对象,只不过显⽰出的记录⽐它实际数量少⼀些⽽已。
如果你不需要同时处理⼀些不同的视图,上述问题并不要紧。编程接⼝赋予了recordset既可以是表也可以是视图的功能。但是在创建时,这不能同时发⽣。在某⼀特定时刻,recordset只能是没有过滤字符串的表或者是激活了过滤字符串的视图。
Recordset 的克隆提供了较好解决这个结构限制的⽅法。正如Clonation and the Case of Table Dolly, Part 1中所说的,克隆recordset相对开销较少,因为它不复制数据,只是复制recordset的基本构造。要处理同⼀数据两个或两个以上的视图,你可以利⽤两个或两个以上克隆,各⾃有⼀套相应的过滤字符串。
图⼀在ADO中处理同⼀recordset不同的视图
在ADO.NET中,你可以使⽤新型对象模型所提供的DataView对象。ADO.NET的DataView对象⽤来表⽰给定数据表的定制的视图,但你可以像处理单独的对象⼀样处理它。DataView对象保留了对表的⼀个引⽤并允许对它进⾏更新。
图⼆在ADO.NET中对同⼀数据表的不同视图进⾏操作
功能上⽽⾔,使⽤ADO Recordset克隆与使⽤特殊的视图对象完成的是同样的功能,都是让你实现过滤,对所选的数据⾏进⾏操作,并同时处理多个视图。
深⼊DataView对象
DataView对象继承了MarshalByValueComponent并实现了⼀组接⼝使之在数据绑定控件中可⽤。Public Class DataView
Inherits MarshalByValueComponent
Implements IBindingList, IList, ICollection,IEnumerable, _
ITypedList, ISupportInitialize
由MarshalByValueComponent派⽣的类是.NET远程组件,可以通过值来列集--即序列化对象到⽬标应⽤程序域。(详见以下关于.NET组件的更多细节)
DataView中的内容可以通过许多编程接⼝进⾏操作,包括集合,列表和枚举器。IBindingList接⼝确保了该类提供所有⽤来⽀持复杂的和简单的数据绑定的必要特征。
总的来说,DataView对象可以⽤来达到两个⽬的。第⼀,视图对于关联DataTable对象和数据绑定控件中的DataSource域是很重要的。第⼆,它也对连接的DataTable提供了⼀层包装,让你能够进⾏过滤,排序,编辑和浏览。
DataView并不是唯⼀的可以通过传值进⾏远程操作的数据驱动类。DataSet和DataTable也具有同样的能⼒,特别是在互操作的场景下。
创建DataViewpublic DataView();
public DataView(DataTable);
DataView只有同已经存在的、很可能是⾮空的DataTable对象连接后才可⽤。通常,这个连接在构造时就指定了。
DataView dv;
dv = new DataView(theDataSet.Tables["Employees"]);
但是,你也可以先创建⼀个新的视图,然后再⽤Table属性同表相关联。
DataView dv = new DataView();
dv. = theDataSet.Tables["Employees"];
DataView构造函数使你由DataTable中得到⼀个DataView对象。如果需要,反之亦可。事实上,DataTable对象的DefaultView属性返回⼀个该表的DataView对象。
DataView dv = dt.DefaultView;
⼀旦你有了DataView对象,你可以利⽤它的属性来建⽴你希望⽤户见到的数据⾏集。⼀般,你可以使⽤下列属性:
RowFilter
Sort
前者可以定制视图中可见数据应匹配的规则。⽽后者通过表达式来进⾏排序。当然你可以使⽤这两者
的任意组合。
设置过滤 RowFilter是⼀个可读写的属性,⽤来读取和设置表过滤的表达式。
public virtual string RowFilter {get; set;}
你可以⽤列名,逻辑和数字运算符和常量的任意合法组合组成表达式。以下是⼀些例⼦:dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
dv.RowFilter = "Description LIKE '*product*'"
让我们来看⼀下过滤器的基本规则和运算符。
过滤字符串是表达式的逻辑连接。可以⽤AND,OR,NOT来连接成⼀个较短的表达式,也可以使⽤圆括号来组成⼦句,指定优先的运算。
通常包含列名的⼦句同字母、数字、⽇期或另⼀个列名进⾏⽐较。这⾥,可以使⽤关系运算符和算术运算符,如>=, <, >, +, *, % (取模)等等。
如果要选取的⾏并不能⽅便地通过算术或逻辑运算符表达,你可以使⽤IN操作符。以下代码显⽰如何选取⼀个随机⾏:
dv.RowFilter = "employeeID IN (2,4,5)"
你也可以使⽤通配符*和%,它们同LIKE运算符⼀起使⽤时显得更有⽤。它们都表⽰任意数量的字符,可以相互替代使⽤。
请注意,如果在LIKE⼦句中已经有了*或%字符,你必须⽤⽅括号将其括起,以免歧义。如果很不幸,字符串中⽅括号本⾝也存在了,那么它也必须⽤将本⾝括起。这样,匹配语句会如下所⽰:
dv.RowFilter = "Description LIKE '[[]*[]]product[[]*[]]"
通配符只允许在过滤字符串的开头或结尾处使⽤,⽽不能在字符串中间出现。例如,下列语句会产⽣运⾏时错误:
dv.RowFilter = "Description LIKE 'prod*ct"
字符串必须以单引号括起,⽽⽇期型必须以#符号括起。字符型值可以使⽤⼩数点和科学计数法。
RowFilter也⽀持聚合函数,如SUM, COUNT, MIN,MAX, and AVG。如果表中没有数据⾏,那么函数将返回NULL。
在介绍RowFilter表达式的最后,让我们讨论三个很便利的函数:Len,IIF和Substring。
正如其名,Len()返回特定表达式的长度。该表达式可以是⼀个列名,也可以是其他合法的表达式。
Substring()返回指定的表达式⾃特定位置开始,特定长度的字符⼦串。
我最喜欢⽤的是IIF(),它按照逻辑表达式的值有⼀到两个值。IIF是IF-THEN-ELSE语句的紧凑表达。语法如下:
IIF(expression, if_true, if_false)
通过该函数,可以建⽴⾮常复杂的过滤字符串。例如,假定你从SQL Server的Northwind数据库中取得Employees表,下列表达式可以选出那些employeeID⼩于6且lastname为偶数个字符和employeeID⼤于6且lastname为奇数个字符的员⼯。
IIF(employeeID<6, Len(lastname) %2 =0, Len(lastname) %2 >0)
下图显⽰了结果(样品应⽤程序会在稍后讨论)
图三对Northwind中的表进⾏过滤
例⼦程序是⼀个Windows® Form应⽤程序,其中使⽤了两个datagrid
控件来实现master/detail结构。⼀个grid在载⼊时⽣成,即在SQL
Server data adapter完成数据读取⼯作之后。请注意,data
adapter是Beta 2中引⼊的,在Beta 1中相应的是SQLDataSetCommand类。
预排视图
在上⾯的举例中,datagrid必须负责预排视图中的数据⾏,以便刷新⽤户界⾯。这个⾃动机制是.NET
数据绑定的产物。Datagrid是通过DataSource属性来获取数据的数据绑定控件。DataView是⼀个可数据绑定的类,可构建DataSource属性的内容。
如果你想使⽤datagrid之外的另⼀个控件,应该怎么办呢?⼜如果你不想使⽤⾃动数据绑定呢?应该怎样预排视图中所选的数据⾏呢?DataView  的好处就是能够给⼀个DataTable定义多个视图,当有两个DataGrid需要显⽰同⼀个DataTable中的数据的时候,可以定义两个DataView来绑定到控件上。
DataReader⽤于⼀⾏⼀⾏的读取数据。
是数据集...⾥⾯放的是多个数据表.⽤来保存查询到的数据.  它相对于DataReader可以创建本地副本,还可以进⾏很多操作,⽐如筛选,排序等,若对数据不进⾏操作最好选择DataReader.DataSet是个类.
DataGrid是显⽰数据的控件.
datatable、⼀个数据的表
把dataset看作数据库,
把datatable看作数据库⾥的⼀个表
把datagridview看作显⽰表⾥数据的表格⼯具
DataReader基于连接,它返回的数据是只读只向前的,适合简单地浏览且耗时⽐较短的操作。DataSet对象会将所需数据读⼊内存然后断开连接。它适合对数据进⾏复杂长时间的操作,并且需要更新数据的情况。
SqlDataReader只是建⽴与数据库之间的类似于⼀个指针关系,在没有调⽤Read()⽅法之间它不从数
据读出任何数据,⽽在调⽤Read()时也只是从数据库中读出⼀条数据.DATATABLE是数据表的⼀个复本,⾄于DataSet可以反它看作⼀个数据库,因为它不但可以包括多个表⽽且还能包括各表之间的关系.所以在进⾏⼤量数据访问时(特别是分页⽅式的访问)建议使⽤SqlDataReader,这样可以节省⼤量的内存开销.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。