dataTable 、dataView、Dataset 区别
dataTable 、dataView、Dataset 区别的经典回答
1、DataView是DataTable的表示,DataTable表里的记录是没有顺序的,但显示可以有不同顺序(DataVIew),
但还是同一张表,所以一个DataTable可以有多个DataView,默认访问DataTable,其实是访问他的
DefaultView。DataSet则是DataTable的集合,也可以有不止一个DataTable
2、DataView 是一张DataTable的虚拟视图 ,主要用来显示数据的 ,其实数据的更改都是发生在DataTable中。
如果以数据库来打比方,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.Table = 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之外的另一个控件,应该怎么办呢?又如果你不想使用自动数据绑定呢?应该怎样预排视图中所选的数据行呢?
dataTable 、dataView、Dataset 区别的更多相关文章
- c#中DataTable和DataSet区别
你可以把DataTable和DataSet看做是数据容器,比如你查询数据库后得到一些结果,可以放到这种容器里,那你可能要问:我不用这种容器,自己读到变量或数组里也一样可以存起来啊,为什么用容器? 原因 ...
- DataTable,DataSet,DataRow与DataView
DataTable和DataSet可以看做是数据容器,比如你查询数据库后得到一些结果,可以放到这种容器里,那你可能要问:我不用这种容器,自己读到变量或数组里也一样可以存起来啊,为什么用容器?原因是,这 ...
- DataTable和DataSet有什么区别
DataTable和DataSet有什么区别 DataSet:数据集.一般包含多个DataTable,用的时候,dataset["表名"]得到DataTable DataTab ...
- DataSet、DataTable、DataRow区别
DataSet 表示数据在内存中的缓存. 属性 Tables 获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据 ...
- datatable和dataset的区别
DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表.插入数据库中 DataSet是DataTable的容器DataSet可以比作一个内存中的数据库,DataT ...
- .Net中List<T> 泛型转成DataTable、DataSet
在开发过程过程中有时候需要将List<T>泛型转换成DataTable.DataSet,可以利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. 1.List<T& ...
- DataTable与DataSet
转自:http://www.cnblogs.com/rjf1979/archive/2010/09/09/1822667.html DataSet包含很多个DataTable 一张表的时候用DataT ...
- Asp.net 将DataTable 或者DataSet 转换为Json 格式
Web 开发中,将从数据库中取到的数据直接转换为 Json 格式的数据,在前台通过Ajax 无刷新显示在界面上,下面提供将DataTable 或者DataSet 转换为Json 的方法 /// < ...
- 【C#常用方法】2.DataTable(或DataSet)与Excel文件之间的导出与导入(使用NPOI)
DataTable与Excel之间的互导 1.项目添加NPOI的引用 NPOI项目简介: NPOI是一个开源的C#读写Excel.WORD等微软OLE2组件文档的项目,特点是可以在没有安装Office ...
随机推荐
- 全面解读php-开发环境及配置
一.版本控制软件 1.集中式 (CVS和 SVN) 中间有一个中央服务器,所有的客户机都会把版本信息上传到中央服务器里,版本信息只在中央服务器里保存,当我们去上传或者下载的时候 ,都是从中央服务器来连 ...
- leetcode 135分发糖果
这是一道hard题,不好想,但最后还是想出来了,私以为还是根据一些思想方法自己想出来做法印象比较深刻,其次看人家的做法思想自己写代码,其次看代码理解默写,其次直接抄代码: 首先,给每个孩子都发一个糖果 ...
- BurpSuite(二) proxy 模块
Proxy代理模块作为BurpSuite的核心功能,拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流. Burp 代理允许你 ...
- MVC1:.Net MVC Cotroller向View传值
下面介绍 ASP .Net MVC中 Cotroller 向 View 传值 的4中方式: ViewBag,ViewData,TempData,Model. (注:参数可根据需要为复杂类型,只需在应用 ...
- 四十三:数据库之SQLAlchemy之group_by和having子句
group_by:根据某个字段进行分组,比如想要根据年龄进行分组,再统计每一组有多少人having:对查找结果进一步过滤,类似于SQL语句的where 准备工作 from sqlalchemy imp ...
- VirtualBox-5.2.8-121009-Win.exe虚拟机桥接
- Redis 入门 3.2.4 命令拾遗
Redis 入门 3.2 字符串类型 3.2.4 命令拾遗 1. 增加指定的整数 INCRBY key increment INCRBY命令与INCR命令基本一样,只不过前者可以通过increme ...
- 封装cookie,自定义过期时间,domain,path
在使用Cookie进行存储的时候,遇到了许多不可思议的bug,特地标识出来,以作总结. 是这样一个项目,登录是放在官网进行操作的,而登录进入的是后台,后台和官网属于同一域名的不同目录,那么常规进行co ...
- cocos2dx[3.2](8) 数学类Vec2/Size/Rect
数学类Vec2.Size.Rect,是cocos2dx中比较常用的类. 比如设置图片位置,设置图片大小,两图片的碰撞检测等等. 比起2.x版本,在3.x中本质上其实没有太大的变化,主要的变化就是将全局 ...
- P1706 【全排列问题】
超级无敌大题面~~ 这题倒也花了我不少时间,不停想节省空间,但这也确实是最省的了... 主要思路呢,要注意标记数有没有选过,并标记每个数的输出顺序.. 具体注释见代码: #include<cst ...