马自达6睿翼和马自达6:DataSet与DataReader的区别解读

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 03:24:39

资料一:

ADO.NET提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet和DataReader。

DataSet提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。

DataReader提供一个来自数据库的快速、仅向前、只读数据流。
当使用DataSet时,经常会利用DataAdapter(也可能是CommandBuilder)与数据源进行交互。当使用DataSet时,也可以利用DataView对DataSet中的数据应用排序和筛选。也可以从DataSet继承,创建强类型DataSet,用于将表、行和列作为强类型对象属性公开。
当设计应用程序时,要考虑应用程序所需功能的等级,以确定使用DataSet或者是DataReader。
要通过应用程序执行以下操作,就要使用DataSet:
在结果的多个离散表之间进行导航。
操作来自多个数据源(例如,来自多个数据库、一个XML文件和一个电子表格的混合数据)的数据。
在各层之间交换数据或使用XML Web服务。与DataReader不同的是,DataSet能传递给远程客户端。
重用同样的记录集合,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。
每条记录都需要执行大量处理。对使用DataReader返回的每一行进行扩展处理会延长服务于DataReader的连接的必要时间,这影响了性能。
使用XML操作对数据进行操作,例如可扩展样式表语言转换(XSLT转换)或XPath查询。

对于下列情况,要在应用程序中使用DataReader:
不需要缓存数据。
要处理的结果集太大,内存中放不下。
一旦需要以仅向前、只读方式快速访问数据。
注:填充DataSet时,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表现为节省了DataSet占用内存和填充DataSet需要的循环。一般来说,此性能提升只是象征性的,因此,设计决策应以所需功能为基础。

资料二:

1:DataReader适合只取出数据并快速显示的情况,学过asp的朋友可以把DataReader比喻成Forwardonly Cursor,使用DataReader必须和数据库永久链接,换句话说他是面向链接的对象。它一次只能取出一条记录,不能把数据做为整体进行处理,所以他不能排序,过滤,计算总数。
DataSet是把数据库整体取出来放到缓冲池里,然后断开链接,所以它是面向断开链接的。可以做为整体考虑!

2:DataSet功能非常强大,如果善于利用,可以大大提高网站的性能。
   |----------缓存DataSet: Cache["DataSetCache"]=ds;
   |----------Cache.Remove("DataSetCache");
----------------------------------------------------------------

DataTable
1:常用的构造函数

LEADBBS CODE
new DataTable()
new DataTable(DataTableName)
new DataTable(DataTableName,Namespace)

2:常用的属性
、CaseSensitive :指示表中的字符串比较是否区分大小写。
、PrimaryKey:DataColumn[] 获取或设置充当数据表主键的列的数组。
、TableName :获取或设置表名.
、MinimumCapacity:设置DataTable最初接受的行数
、DefaultView :获取可能包括筛选视图或游标位置的表的自定义视图
、ChildRelations :获取此 DataTable 的子关系的集合。
3:常用的方法
、Select(FilterStr):按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有 DataRow 对象的数组。
、NewRow :创建与该表具有相同架构的新 DataRow。
、Compute:DataTable,Compute(Expression,Fiter)
--------------------------------------------------------------------------------
DataColumn
1:常见的构造函数
、new DataColumn()
、new DataColumn(ColumnName,DataType)
2:常见的属性
、AllowDBNull:是否列允许为Null
、AutoIncrement,AutoIncrementSeed,AutoInCrementStep
、ColumnName
、DataType
、DefaultValue
、Expression:获取或设置表达式,用于筛选行、计算列中的值或创建聚合列。


LEADBBS CODE

SqlConnection conn = new SqlConnection("server=ROBOTH\\SQLEXPRESS;uid=saa;pwd=000;database=MmyeeAd;");
            conn.Open();
            SqlDataAdapter sda = new SqlDataAdapter("select * from Category", conn);
            DataSet ds = new DataSet();
            sda.Fill(ds, "Category");

            sda.SelectCommand = new SqlCommand( "select * from Product", conn) ;
            sda.Fill(ds, "Product");

            ds.Relations.Add("testRelation", ds.Tables["Category"].Columns["CategoryName"], ds.Tables["Product"].Columns["ProductCategory"]);

            DataColumn dc = new DataColumn("expression1", typeof(decimal));
            dc.Expression = "COUNT(Child.ProductID)";
            ds.Tables["Category"].Columns.Add(dc);

            this.dgProduct.DataSource = ds;
            this.dgProduct.DataMember = "Category";
            this.dgProduct.DataBind();

、MaxLength 获取或设置文本列的最大长度。列的最大长度(以字符数表示)。如果列没有最大长度,该值为 –1(默认值)。
、ReadOnly:表示该列是否为只读
、Unique 获取或设置一个值,该值指示列的每一行中的值是否必须是唯一的。


实例
LEADBBS CODE

using System;
using System.Data;
class testDataTable
{
    private static void Main()
    {
        DataTable t;
        DataRow[] foundRows;
       

        t = CreateDataSet().Tables[0];

        t.CaseSensitive = false;
        foundRows = t.Select("item = """"""""""""""""abc""""""""""""""""");

        // Print out DataRow values.
        PrintRowValues(foundRows, "CaseSensitive = False");

        t.CaseSensitive = true;
        foundRows = t.Select("item = """"""""""""""""abc""""""""""""""""");

        PrintRowValues(foundRows, "CaseSensitive = True");
    }

    public static DataSet CreateDataSet()
    {
        // Create a DataSet with one table, two columns
        DataSet ds = new DataSet();
        DataTable t = new DataTable("Items");

        // Add table to dataset
        ds.Tables.Add(t);

        // Add two columns
        DataColumn c;

        // First column
        c = t.Columns.Add("id", typeof(int));
        c.AutoIncrement = true;

        // Second column
        t.Columns.Add("item", typeof(string));

        // Set primary key
        t.PrimaryKey = new DataColumn[] { t.Columns["id"] };

        // Add twelve rows
        for (int i = 0; i < 10; i++)
        {
            t.Rows.Add(new object[] { i, i.ToString() });
           
        }
        t.Rows.Add(new object[] { 11, "abc" });
        t.Rows.Add(new object[] { 15, "ABC" });

        return ds;
    }

    private static void PrintRowValues(DataRow[] rows, string label)
    {
        Console.WriteLine();
        Console.WriteLine(label);
        if (rows.Length <= 0)
        {
            Console.WriteLine("no rows found");
            return;
        }
        foreach (DataRow r in rows)
        {
            foreach (DataColumn c in r.Table.Columns)
            {
                Console.Write("\t {0}", r[c]);
            }
            Console.WriteLine();
        }
    }
}

资料三:

在asp.net中,读取数据库中的数据可以使用DataReader和DataSet 2种方式,
两者的差异如下:
使用Dataset对象读取数据大致需要以下5个步骤:
(1)建立数据库链接,可以选用SQLConnection或者01edbConnection。
(2)将查询保存在SQLDataAdapter或者oledbDataAdapter对象中。
(3)使用DataAdapter对象的Fill方法将数据填充到DataSet中的DataTable中。
(4)为DataTable对象建立DataView对象以显示数据,这一步可以省略。
(5)将DataView或者DataSet绑定到Server Control上。

使用DataReader读取数据大致需要以下6个步骤:
(1)建立数据库链接,可以选SQLConnection或者OLedbConnection。
(2)使用Connection对象的open方法打开数据库链接。
(3)将查询保存在SQLCommand或者OledbCommand对象中。
(4)调用Command对象的ExecuteReader方法,将数据读入DataReader对象中。
(5)调用DataReader的Read或者Get方法读取—笔数据,以便显不。
(6)调用Connection对象的Close方法,关闭数据序链接。

在网上关于DataSet和DataReader的使用的讨论很多,大都是讨论到底该使用DataSet还是DataReader,我也发表一下我的看法。先看一下DataSet和DataReader的区别,DataSet实际上是一个离线数据集,DataSet不用保持数据库连接,而 DataReader需要保持数据库连接,这应当是两者的本质区别,分别对应的ava中的CachedRowSet 和ResultSet,所以两者各有各的用处,DataSet使用前必须填充,所以必须从内存中开辟内存存储DataSet的内容,而 DataReader的使用必须使数据库连接有效,但是不必开辟内存存储所有的数据,所以在数据量较小时,使用DataSet可以提升性能,因为所有的数据都在内存中操作,但数据量较大时(“较大“的标准不一,一般上千条的数据应当称作较大了吧)使用DataReader就有优势,因为 DataReader每次读取都是利用自身保持的数据库连接从数据库中动态读取,不会将大量的数据一下装入内存(也就是所谓的懒装入 lazyloding),但缺点是只读,并且是仅向前的,如果你要多次使用同一个数据,还是得先缓存该数据,否则读取一次后将不能重复读取,所以建议就是数据量较少的时候用DataSet,而数据量大时使用DataReader当然,不管使用那个,都应当尽量将查询数量降到最低,只有这样才能做到高效使用,另外,如果你针对每一条数据都需要一个耗时操作的话,要避免使用DataReader,因为数据库连接资源是非常宝贵的,一个服务器连接池中一般就十几个连接罢了,要是每人都保持连接的话,用不了多久就会耗光