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