DataSet对象

DataSet对象作为ADO.NET中访问数据库的关键组件,提供离线数据存储,支持多种数据源。它通过DataAdapter与数据库交互,可以高效地填充和更新数据。DataSet内部使用动态XML存储数据,独立于数据源,具有高度的灵活性。它包含DataTable和DataRelation对象,用于表示数据表和表间关系。通过DataRow和DataColumn,可以进行数据操作,如插入、删除和修改。在修改后,使用DataAdapter的Update方法将更改同步回数据库。

DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库。并且,由于DataSet对象具有离线访问数据库的特性,所以它更能用来接收海量的数据信息。
 
1  DataSet对象概述
 
DataSet是ADO.NET中用来访问数据库的对象。由于其在访问数据库前不知道数据库里表的结构,所以在其内部,用动态XML的格式来存放数据。这种设计使DataSet能访问不同数据源的数据。
 
DataSet对象本身不同数据库发生关系,而是通过DataAdapter对象从数据库里获取数据并把修改后的数据更新到数据库。在DataAdapter的讲述里,就已经可以看出,在同数据库建立连接后,程序员可以通过DataApater对象填充 (Fill)或更新(Update)DataSet对象。
 
.NET的这种设计,很好地符合了面向对象思想里低耦合、对象功能唯一的优势。如果让DataSet对象能直接连到数据库,那么DataSet对象的设计势必只能是针对特定数据库,通用性就非常差,这样对DataSet的动态扩展非常不利。
 
由于 DataSet 独立于数据源,DataSet 可以包含应用程序本地的数据,也可以包含来自多个数据源的数据。与现有数据源的交互通过DataAdapter 来控制。
 
DataSet对象常和DataAdapter对象配合使用。通过DataAdapter对象,向DataSet中填充数据的一般过程是:
 
(1) 创建DataAdapter和DataSet对象。
 
(2) 使用DataAdapter对象,为DataSet产生一个或多个DataTable对象。
 
(3) DataAdapter对象将从数据源中取出的数据填充到DataTable中的DataRow对象里,然后将该DataRow对象追加到DataTable对象的Rows集合中。
 
(4) 重复第(2)步,直到数据源中所有数据都已填充到DataTable里。
 
(5) 将第(2)步产生的DataTable对象加入DataSet里。
 
而使用DataSet,将程序里修改后的数据更新到数据源的过程是:
 
(1) 创建待操作DataSet对象的副本,以免因误操作而造成数据损坏。
 
(2) 对DataSet的数据行(如DataTable里的DataRow对象)进行插入、删除或更改操作,此时的操作不能影响到数据库中。
 
(3) 调用DataAdapter的Update方法,把DataSet中修改的数据更新到数据源中。
 
2  DataSet对象模型
 
从前面的讲述中可以看出,DataSet对象主要用来存储从数据库得到的数据结果集。为了更好地对应数据库里数据表和表之间的联系,DataSet对象包含了DataTable和DataRelation类型的对象。
 
其中,DataTable用来存储一张表里的数据,其中的 DataRows对象就用来表示表的字段结构以及表里的一条数据。另外,DataTable中的DataView对象用来产生和对应数据视图。而 DataRelation类型的对象则用来存储DataTable之间的约束关系。DataTable和DataRelation对象都可以用对象的集合 (Collection)对象类管理。
 
由此可以看出,DataSet 中的方法和对象与关系数据库模型中的方法和对象一致,DataSet对象可以看作是数据库在应用代码里的映射,通过对DataSet对象的访问,可以完成对实际数据库的操作。
 

DataSet对象模型中的各重要组件说明如下。
 
1. DataRelationCollection和DataRelation
 
DataRelation对象用来描述DataSet里各表之间的诸如主键和外键的关系,它使一个 DataTable 中的行与另一个 DataTable 中的行相关联,也可以标识 DataSet 中两个表的匹配列。
 
DataRelationCollection是DataRelation对象的集合,用于描述整个DataSet对象里数据表之间的关系。
 
2. ExtendedProperties
 
DataSet、DataTable 和 DataColumn 全部具有 ExtendedProperties 属性。可以在其中加入自定义信息,例如用于生成结果集的SQL 语句或生成数据的时间。
 
3. DataTableCollection和DataTable
 
在DataSet里,用DataTable对象来映射数据库里的表,而DataTableCollection用来管理DataSet下的所有DatabTable。
 
DataTable具有以下常用属性。
 
(1) TableName:用来获取或设置DataTable的名称。
 
(2) DataSet:用来表示该DataTable从属于哪个DataSet。
 
(3) Rows:用来表示该DataTable的DataRow对象的集合,也就是对应着相应数据表里的所用记录。程序员能通过此属性,依次访问DataTable里的每条记录。该属性有如下方法。
 
Ü  Add:把DataTable的AddRow方法创建的行追加到末尾。
 
Ü  InsertAt:把DataTable的AddRow方法创建的行追加到索引号指定的位置。
 
Ü  Remove:删除指定的DataRow对象,并从物理上把数据源里的对应数据删除。
 
Ü  RemoveAt:根据索引号,直接删除数据。
 
(4) Columns:用来表示该DataTable的DataColumn对象的集合,通过此属性,能依次访问DataTable里的每个字段。
 
DataTable具有以下常用方法。
 
Ü  DataRow NewRow ()方法:该方法用来为当前的DataTable增加一个新行,返回表示行记录的DataRow对象,但该方法不会把创建好的DataRow添加到 DataRows集合中,而是需要通过调用DataTable对象Rows属性的Add方法,才能完成添加动作。
 
Ü  DataRow[] Select()方法:该方法执行后,会返回一个DataRow对象组成的数组。
 
Ü  void Merge (DataTable table)方法:该方法能把参数中的DataTable和本DataTable合并。
 
Ü  void Load (IDataReader reader)方法:该方法通过参数里的IdataReader对象,把对应数据源里的数据装载到DataTable里,以便后继操作。
 
Ü  void Clear ()方法:该方法用来清除DataTable里的数据,通常在获取数据前调用。
 
Ü  void Reset()方法:该方法用来重置DataTabl对象。
 
3  DataColumn和DataRow对象
 
在DataTable里,用DataColumn对象来描述对应数据表的字段,用DataRow对象来描述对应数据库的记录。
 
值得注意的是,DataTable对象一般不对表的结构进行修改,所以一般只通过Column对象读列。例如,通过DataTable.Table["TableName"].Column[columnName]来获取列名。
 
DataColumn对象的常用属性如下。
 
Ü  Caption属性:用来获取和设置列的标题。
 
Ü  ColumnName属性:用来描述该DataColumn在DataColumnCollection中的名字。
 
Ü  DataType属性:用来描述存储在该列中数据的类型。
 
在DataTable里,用DataRow对象来描述对应数据库的记录。
 
DataRow对象和DataTable里的Rows属性相似,都用来描述DataTable里的记录。同 ADO版本中的同类对象不同的是,ADO.NET下的DataRow有“原始数据”和“已经更新的数据”之分,并且,DataRow中的修改后的数据是不能即时体现到数据库中的,只有调用DataSet的Update方法,才能更新数据。
 
DataRow对象的重要属性有RowState属性,用来表示该DataRow是否被修改和修改方式。RowState属性可以取的值有Added、Deleted、Modified或Unchanged。
 
而DataRow对象有以下重要方法。
 
Ü  void AcceptChanges ()方法:该方法用来向数据库提交上次执行AcceptChanges方法后对该行的所有修改。
 
Ü  void Delete ()方法:该方法用来删除当前的DataRow对象。
 
Ü  设置当前DataRow对象的RowState属性的方法:此类方法有:
 
void SetAdded();
 
void SetModified();
 
分别用来把DataRow对象设置成Added和Modified。
 
Ü  void RejectChanges()方法:该方法用来撤销自上次执行AcceptChanges后的所有修改。
 
Ü  void BeginEdit ()方法:该方法用来对DataRow对象开始编辑操作。
 
Ü  void cancelEdit()方法:该方法用来取消对当前DataRow对象的编辑操作。
 
Ü  void EndEdit()方法:该方法用来终止对当前DataRow对象的编辑操作。
 
下面的代码讲述了如何综合地使用DataTable、DataColumn和DataRow对象进行数据库操作。
 
private void DemonstrateRowBeginEdit()
 
{
 
//创建DataTable对象
 
DataTable table = new DataTable("table1");
 
   

//创建DataColumn对象,并设置其属性为Int32类型
 
DataColumn column=new DataColumn("col1",Type.GetType("System.Int32"));       

    //添加Column到dataTable中
 
table.Columns.Add(column);
 
    // 使用for循环,创建5个DataRow对象并添加到DataTable中
 
    DataRow newRow;
 
    for(int i = 0;i<5; i++)
 
    {
 
        // RowChanged event will occur for every addition
 
        newRow= table.NewRow();
 
        newRow[0]= i;
 
        table.Rows.Add(newRow);
 
    }   

// 使用dataTable的AcceptChanges方法,将更改提交到数据库中
 
    table.AcceptChanges();
 
    // 开始操作DataRow中的每个对象
 
    foreach(DataRow row in table.Rows)
 
    {
 
        //使用BeginEdit方法开始操作
 
        row.BeginEdit();
 
        row[0]=(int) row[0]+10;
 
    }
 
    table.Rows[0].BeginEdit();
 
    table.Rows[1].BeginEdit();
 
    table.Rows[0][0]= 100;
 
    table.Rows[1][0]=100;
 
    try
 
    {
 
        // 终止对DataRow对象进行操作
 
        table.Rows[0].EndEdit();
 
        table.Rows[1].EndEdit();
 
    }
 
    catch(Exception e)
 
    {
 
        //出错处理
 
        Console.WriteLine("Exception of type {0} occurred.",

            e.GetType());
 
    }
 
}
 
上述代码的主要业务逻辑如下:
 
(1) 创建DataTable和DataColumn类型的对象,并把DataColumn对象的数据类型设置成System.Int32。也就是说,使用该DataColumn对象可以对应地接收int类型的字段数据。
 
(2) 把DataColumn对象添加到DataTable中。
 
(3) 依次创建5个DataRow对象,同时通过for循环给其赋值。完成赋值后,将这5个DataRow对象添加到DataTable中。
 
(4) 使用AcceptChanges方法,实现DataColumn和DataRow对象的更新。
 
(5) 使用BeginEdit方法,开始编辑DataRow对象,使用EndEdit方法来表示编辑结束。
 
使用DataTable、DataColumn和DataRow对象访问数据的一般方式有以下几种。
 
(1) 使用Table名和Table索引来访问DataTable。为了提高代码的可读性,推荐使用Table名的方式来访问Table。代码如下:
 
DataSet ds = new DataSet();
 
DataTable dt = new DataTable("myTableName");
 
//向DataSet的Table里添加一个dataTable
 
ds.Tables.Add(dt);
 
//访问dataTable
 
//1 通过表名访问,推荐使用
 
ds.Tables["myTableName"].NewRow();
 
//2 通过索引访问,索引值从0开始,不推荐使用
 
ds.Tables[0].NewRow();
 
(2) 使用Rows属性访问数据记录,例如:
 
foreach(DataRow row in table.Rows)
 
{
 
    row[0]=(int) row[0]+10;
 
}
 
(3) 使用Rows属性,访问指定行的指定字段,例如:
 
//首先为DataTable对象创建一个数据列
 
DataTable table = new DataTable("table1");

DataColumn column = new

        DataColumn("col1",Type.GetType("System.Int32"));

table.Columns.Add(column);
 
// 其次为DataTable添加行数据
 
newRow= table.NewRow();
 
newRow[0]= 10;
 
table.Rows.Add(newRow);
 
//设置索引行是0,列名是col1的数据
 
table.Rows[0]["col1"]= 100;
 
//设置索引行是0,索引列是0的数据,这种做法不推荐
 
//table.Rows[0][0]= 100;
 
(4) 综合使用DataRow和DataColumn对象访问DataTable内的数据。从以下代码可以看出,DataTable对象中的Rows属性对应于它的DataRow对象,而Columns属性对应于DataColumn。
 
foreach(DataRow dr in dt.Rows)
 
{
 
    foreach(DataColumn dc in dt.Columns)
 
    {
 
//用数组访问数据
 
dr[dc] = 100;
 
    } 

}
 
4  使用DataSet对象访问数据库
 
当对DataSet对象进行操作时,DataSet对象会产生副本,所以对DataSet里的数据进行编辑操作不会直接对数据库产生影响,而是将DataRow的状态设置为added、deleted或changed,最终的更新数据源动作将通过 DataAdapter对象的update方法来完成。
 
DataSet对象的常用方法如下。
 
Ü  void AcceptChanges():该方法用来提交DataSet里的数据变化。
 
Ü  void clear():该方法用来清空DataSet里的内容。
 
Ü  DataSet copy():该方法把DataSet的内容复制到其他DataSet中。
 
Ü  DataSet GetChanges():该方法用来获得在DataSet里已经被更改后的数据行,并把这些行填充到Dataset里返回。
 
Ü  bool HasChanges():如果DataSet在创建后或执行AcceptChanges后,其中的数据没有发生变化,返回True,否则返回False。
 
Ü  void RejectChanges():该方法撤销DataSet自从创建或调用AcceptChanges方法后的所有变化。
 
DataSet对象一般是和DataAdapter 对象配合使用。下面的代码演示了如何综合使用DataSet和DataAdapter 对象访问数据库。
 
//省略获得连接对象的代码
 

 
//创建DataAdatper
 
string sql = " select * from user";
 
SqlDataAdapter sda = new SqlDataAdapter(sql,conn)
 
//创建并填充DataSet
 
DataSet ds = new DataSet();
 
sda.fill(ds,”user”);
 
//给DataSet创建一个副本,操作对副本进行,以免因误操作而破坏数据
 
DataSet dsCopy = ds.Copy();
 
DataTable dt = ds.Table["user"];
 
//对DataTable中的DataRow和DataColumn对象进行操作
 

 
//最后将更新提交到数据库中
 
sda.update(ds, "user");
 
上述代码的主要业务流程如下。
 
(1) 创建DataAdapter和DataSet对象,并用DataAdapter的SQL语句生成的表填充到DataSet的DataTable中。
 
(2) 使用DataTable对表进行操作,例如做增、删、改等动作。
 
(3) 使用DataAdapter的update语句将更新后的数据提交到数据库中。
 
另外,上述代码在操作DataSet前,为DataSet创建了一个副本,用来避免误操作。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kybd2006/archive/2007/07/12/1687028.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值