DataSet DataTable DataReader DataAdapter详解

 public JsonResult Test()        {            JsonResult json = new JsonResult                                 {                                     Data = new                                                {                                                    Name = "zzl",                                                    Sex = "male",                                                }                                 };            return Json(json);        }         public JsonResult TestList()        {            List<User> userList = new List<User>            {              new User{Name="zzl",Email="bfyxzls@sina.com"},              new User{Name="zhz",Email="zhanghangzheng@sina.com"},            };            JsonResult json = new JsonResult                                 {                                     Data = userList                                 };            return Json(json);            //return Json(json, JsonRequestBehavior.AllowGet);//前台AJAX如果是GET用这句                       //什么时候用GET请求呢,当我们直接在浏览器中输入网址时,其实就是一个GET请求                       //如果我们直接输入/Home/TestList这个网址,它会提示我们下载这个JSON格式的文档        }前台调用:

<script>    $.ajax({        url: "/Home/Test",        dataType: "json",        cache: false,        data: null,        type: "POST",        success: function (data) {            alert(data.Data.Name);        }    });      $.ajax({        url: "/Home/TestList",        dataType: "json",        cache: false,        data: null,        type: "POST",        success: function (data) {            var msg = "";            for (var i = 0, length = data.Data.length; i < length; i++) {                msg += "<DiV>Name:" + data.Data[i].Name + ",Email:" +                 data.Data[i].Email + "</div>";            }            $("#msg2").html(msg);        }    }); </script>第二种列表的方法,也可以这样来实现更加简单:

 

  public JsonResult TestList()        {            List<User> userList = new List<User>            {              new User{Name="zzl",Email="bfyxzls@sina.com"},              new User{Name="zhz",Email="zhanghangzheng@sina.com"},              new User{Name="zql",Email="zql1980.happy@sina.com"},            };            return Json(userList);                       //return Json(userList, JsonRequestBehavior.AllowGet);//前台AJAX如果是GET用这句        }$.ajax({        url: "/Home/TestList",        dataType: "json",        cache: false,        data: null,        type: "POST",        success: function (data) {            var msg = "<table border=1><thead><tr><td>Name</td><td>Email</td>                       </tr></thead><tbody>";            for (var i = 0, length = data.length; i < length; i++) {                msg += "<tr><td>" + data[i].Name + "</td><td>"                     + data[i].Email + "</td></tr>";            }            msg += "</body></table>";            $("#msg2").html(msg);        }    });注意看红色的部分,是否是更简单了呢!哈哈纯JS进行操作:

     var arr = [{ "name": "zzl", "sex": "男" }, { "name": "lr", "sex": "女"}];        for (var i = 0; i < arr.length;i++ ) {            document.write(arr[i].name);        }1.四者各自的介绍

DataSet是用来做连接sql的一种方法,意思是把数据库教程的副本存在应用程序里,相当于存在内存中的数据库,应用程序开始运行时,把数据库相关数据保存到DataSet.

DataTable表示内存中数据的一个表.常和DefaultView使用获取可能包括筛选视图或游标位置的表的自定义视图。

DataReader对象是用来读取数据库的最简单方式,它只能读取,不能写入,并且是从头至尾往下读的,无法只读某条数据,但它占用内存小,速度快

DataAdapter对象是用来读取数据库.可读取写入数据,某条数据超着强,但它占用内存比dataReader大,速度慢,一般和DataSet连用.

Dataset表示一个数据集,是数据在内存中的缓存。 可以包括多个表

DataSet 连接数据库时是非面向连接的。把表全部读到Sql中的缓冲池,并断开于数据库的连接

DataReader 连接数据库时是面向连接的。读表时,只能向前读取,读完数据后由用户决定是否断开连接。

分布式系统的数据可能会用DataSet做数据载体,因为DataSet是保存数据的数据结构,而DataReader不承担保存数据的责任,它只负责从数据源读取数据到本地而已,它不是数据结构,而是网络通讯组件的高层封装。 DataAdapter也只是使用DataReader从数据源读取数据并Add到AataSet保存起来而已。假如我们单独使用DataReader也可以把数据写入到业务类或者dataset里。那只是根据业务需要而选择不同的数据载体而已。实际上我们从数据库获得数据都会通过DataReader,只不过DataAdapter把这一切都封装起来了

 

2.DataSet 和 DataReader对象有什么区别?

DataSet可以离线处理,前后滚动.DataReader不能离线处理,且是只读的向前的,不过速度明显会很快 DataSet可以存储数据库各种对象的,比如表触发器等,而DataReader只能存储游标记录

DataSet可以更新回原来的数据库,DataReader不行;

DataSet可以FORWORD PREVIUS,而DataReader只能FW;

DataReader类似一个只能向前的游标记录集

DataSet叫数据集!是ADO.net相对与ADO实现断开式数据库连接性的主要体现!DateReader是一个客户端的只向前游标,两者的应用领域不同!读取数据后!如果要进行比较频繁的改动,可以使用DataSet,并且DataSet也支持串行化,可与xslt结合!进行web开发!

DataReader则偏向于快速读取数据!针对数据量比较大的数据可能应用的更加频繁点!

 

ADO.NET提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet和DataReader。DataSet提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。DataReader提供一个来自数据库的快速、仅向前、只读数据流。

当使用DataSet时,经常会利用DataAdapter(也可能是CommandBuilder)与数据源进行交互。当使用DataSet时,也可以利用DataView对DataSet中的数据应用排序和筛选。也可以从DataSet继承,创建强类型DataSet,用于将表、行和列作为强类型对象属性公开。

下列主题包括的信息涉及:使用DataSet或DataReader的最佳时机、如何优化访问它们所包含数据、以及如何优化使用DataAdapter(包括CommandBuilder)和DataView的技巧。

3.DataSet与DataReader

当设计应用程序时,要考虑应用程序所需功能的等级,以确定使用DataSet或者是DataReader。

要通过应用程序执行以下操作,就要使用DataSet:

在结果的多个离散表之间进行导航。

操作来自多个数据源(例如,来自多个数据库、一个XML文件和一个电子表格的混合数据)的数据。

在各层之间交换数据或使用XML Web服务。与DataReader不同的是,DataSet能传递给远程客户端。

重用同样的记录集合,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。

每条记录都需要执行大量处理。对使用DataReader返回的每一行进行扩展处理会延长服务于DataReader的连接的必要时间,这影响了性能。

使用XML操作对数据进行操作,例如可扩展样式表语言转换(XSLT转换)或XPath查询。

对于下列情况,要在应用程序中使用DataReader:

不需要缓存数据。

要处理的结果集太大,内存中放不下。

一旦需要以仅向前、只读方式快速访问数据。

注填充DataSet时,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表现为节省了DataSet占用内存和填充DataSet需要的循环。一般来说,此性能提升只是象征性的,因此,设计决策应以所需功能为基础。

经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)比DataSet好。有时候我也会看到相反的说法。事实上,Microsoft创建了这两个数据存取类是因为它们都是我们所需要的。每个类都有其优点和不足,你可以根据应用环境来选择用哪一个。

本文就两者的选择问题做了很清楚的讲述,可以让你在运用ASP.NET时,在选择DataReader类或DataSet类的方面得到一些指南。在基于客户端的Windows Form应用程序环境下,这些规则可能会改变。我在做这些讲述时,假设你已经用过DataReader和DataSet类了,并对它们很熟悉。

运用DataReader类

下面就是运用DataReader类的理想条件:你读取的数据必须是新的,所以在每次需要数据的时候,你都必须从数据库读取。创建一个DataReader类不会消耗很多内存,不过随着负荷的增加,DataSet上的性能也会很快地提高(参考资源中Visual Studio Magazine中的文章)。

你对每行数据的需求很简单。该情况的最好的例子就是简单地将DataReader绑定到一个Web控件,如DataGrid或DropDownList。

你只需要从数据库中以只向前的(forward-only) 、只读的形式来存取XML数据。在这种情况下,你可以用SQLCommand对象的ExcecuteXmlReader()方法来得到一个XmlReader类(相当于XML版的DataReader)。这就需要一个运用FOR XML子句的SQL Server查询,或者一个包含有效XML的ntext字段。

你计划对数据库进行几个重复的调用,来读取一小块信息。在这种情况下,我们前面提到过的性能数据会有更大的提高。

的确,使DataSet类更强大的许多功能只适用于基于客户端的Windows Form应用程序,比如在多个表之间建立关系的功能。在很多情况下,DataSet类都比DataReader类更有优势,而且在有些情况下,你根本就不能用DataReader类。

运用DataSet类

在下面的情况,你应该考虑运用DataSet类: 你构建了一个Web service,它运用的数据是你作为返回值读取的数据。因为DataReader类必须保持到数据库的连接,所以它们不能被序列化到XML中,也不能被发送给一个Web service的调用者。

你需要排序或筛选数据。在运用一个DataView对象(呈现为DataTable类的DefaultView属性,它包含一个DataSet类)来排序或筛选数据前,我们先试着用SQL查询(如WHERE和ORDER BY语句)来实现这些功能,并运用更轻量级、更快的DataReader类。然而,有时侯用这种方法是不行的,或者当你需要多次地对数据进行排序或筛选时就不能用DataReader。

针对同一请求,你需要多次遍历数据。你只能在DataReader中循环一次。如果你想将多个ServerControl类绑定到同一个数据集,那么选择DataSet就更好。DataReader类不能被绑定到多个ServerControl类,因为它是只向前读取的。在这种情况下,如果要使用DataReader,必须从数据库读取两次数据。

你需要存储数据,而后续的页面请求可能会用到的这些数据。如果数据只被请求它的专门的人使用,你可以将DataSet类保存在一个Session变量中。如果数据可以被任何人访问,那么你可以将它保存在一个Application变量中,或保存在Cache中(我建议使用后一种方法,因为它支持时间期限和回调(callback))。因为DataReader类必须一直打开对数据库的连接,而且它一次只能保存一行数据,所以它们不能在跨页面请求中被保存。

你需要对一个结果集的每个元素实现特殊的、耗时的功能。例如,如果你从一个数据库读取一列邮政编码,并想通过调用一个Web service来得到每个地区的详细的天气状况信息,那么选择DataSet就会更好。这是因为,当你在用DataReader类时,在关闭DataReader类前,与数据库的连接不会被释放回连接池。在数千页面请求之间潜在的一个很小的延时都会造成Web应用程序的很高的访问量,从而就会消耗完可用的连接。相反,DataSet可以在前端读取所有的数据,并可以马上关闭与数据库的连接,将它返回到连接池,因此其它的页面请求就可以用这个连接了。

你需要在一个两维范例中加载并处理XML数据。DataSet类对于XML很有用,因为你可以将DataView用于XML,对根本的数据进行排序和筛选,就同处理一个数据库结果集一样。然而,需要注意的是在System.Xml名字空间中有很多类,你可以将它们用于更复杂的XML操作。

你的数据源不是一个数据库。虽然OleDbDataReader可以用于任何OLEDB数据提供者(可能指向一个数据库,也可能不指向一个数据库),但DataSet对象可以从一个XML文件直接加载数据,并动态地解释它的schema。DataSet类也可以将XML数据写回一个数据流或一个文件。

从上面的讲述我们就可以看到,DataSet类比DataReader类有更多的功能,这就可以让你在更多的情况下运用它们。但这并不意味着你总是在用DataSet类。你需要在ASP.NET中完成的相当大一部分的任务都属于DataReader的范畴。

尽管如此,毫无疑问,从重要程度或复杂程度的角度来说,DataSet类在很多ASP.NET Web应用程序中都起着很重要的作用。你可以通过明智的缓存来最小化数据库往返,从而降低DataSet类的“性能损害”。DataReader和DataSet都是一个成功的ASP.NET Web应用程序的重要的部件。重要的是,我们需要了解何时、在哪里可以最好的使用它们。

时间: 2024-10-26 11:44:18

DataSet DataTable DataReader DataAdapter详解的相关文章

System.Data.DataTable计算功能详解

using System; using System.ComponentModel; using System.Data; using System.Windows.Forms; namespace WindowsApplication1 ...{ public partial class Form1 : Form ...{ public Form1() ...{ InitializeComponent(); } private void button1_Click(object sender,

.net C# DataTable和DataSet对象详解(1/3)

.net c# datatable和dataset对象详解 a.对于1.6.1之前的版本,获得命令的方式可以通过requestscope的idbcommand属性,但是1.6.1版本的idbcommand属性返回的是ibatisnet.datamapper.commands.dbcommanddecorator对象,您可以注释代码验证一下. b.网上有些文章贴的方法返回的dbcommand对象都是对于拼接sql语句而言,没有实现获取存储过程的dbcommand(有参数无参数的都要考虑).本文在原

System.DateTime 详解(续)

在<System.DateTime 详解>一文中,我们从跨时区的角度剖析了我们熟悉的System.DateTime类型.如果你还是采用传统的ADO.NET编程方式,并使用DataSet作为数据实体,可能你会熟悉System.Data.DataSetDateTime这么一个类型.这个类型也是为实现跨时区场景下对时间处理而设计的,为了对前文的补充,这篇文章就来谈谈基于DataSet的时间处理问题. 一.你是否关注过DataColumn的DateTimeMode属性 在ADO.NET编程模型中,Da

详解免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)_实用技巧

很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel报表,并且在后台调用Microsoft Excel ActiveX更有效率;从Office文档中提取文本,以帮助您实现全文索引功能(大多数时候,此功能用于创建搜索引擎): 从Office文档提取图像: 生成包含公式的Excel工作表.  一.NPOI组件概述: NPOI是完全免费使用: 涵盖Exce

AngularJS入门教程中SQL实例详解_AngularJS

AngularJS SQL 在前面章节中的代码也可以用于读取数据库中的数据. 使用 PHP 从 MySQL 中获取数据 AngularJS 实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></s

DataView查询详解与语法

dataview查询详解与语法 dataview 的一个主要功能是允许在 windows 窗体和 web 窗体上进行数据绑定. 另外,可自定义 dataview 来表示 datatable 中数据的子集. 此功能让您拥有绑定到同一 datatable.但显示不同数据版本的两个控件. 例如,一个控件可能绑定到显示表中所有行的 dataview,而另一个控件可能配置为只显示已从 datatable 删除的行. datatable 也具有 defaultview 属性. 它返回表的默认 datavie

一起谈.NET技术,System.DateTime 详解(续)

在<System.DateTime 详解>一文中,我们从跨时区的角度剖析了我们熟悉的System.DateTime类型.如果你还是采用传统的ADO.NET编程方式,并使用DataSet作为数据实体,可能你会熟悉System.Data.DataSetDateTime这么一个类型.这个类型也是为实现跨时区场景下对时间处理而设计的,为了对前文的补充,这篇文章就来谈谈基于DataSet的时间处理问题. 一.你是否关注过DataColumn的DateTimeMode属性 在ADO.NET编程模型中,Da

关于ASP.net服务器的入侵方法详解

asp.net|服务器|详解 有个朋友在QQ上问了我关于ASP.net服务器的入侵方法我将ASP.net上的一些入侵常用手段告诉大家 1.ASP中常用的标准组件:FileSystemObject,这个组件为 ASP 提供了强大的文件系统访问能力,可以对服务器硬盘上的任何有权限的目录和文件进行读写.删除.改名等操作.FSO对象来自微软提供的脚本运行库scrrun.dll中.使用下面的代码就可以在ASP中创建一个FSO对象:Set fso = CreateObject("Scripting.File

必知技巧:ASP.NET中常用的优化性能方法详解

asp.net|技巧|详解|性能|优化 1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求. 连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能.因此,在建立数据库连接后