C#与数据库访问技术总结(十六)之 DataSet对象

DataSet对象

DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库。

并且,由于DataSet对象具有离线访问数据库的特性,所以它更能用来接收海量的数据信息。

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中修改的数据更新到数据源中。

DataSet对象模型

从前面的讲述中可以看出,DataSet对象主要用来存储从数据库得到的数据结果集。

为了更好地对应数据库里数据表和表之间的联系,DataSet对象包含了DataTable和DataRelation类型的对象。

其中,DataTable用来存储一张表里的数据,其中的DataRows对象就用来表示表的字段结构以及表里的一条数据。

另外,DataTable中的DataView对象用来产生和对应数据视图。

而DataRelation类型的对象则用来存储DataTable之间的约束关系。

DataTable和DataRelation对象都可以用对象的集合(Collection)对象类管理。

由此可以看出,DataSet中的方法和对象与关系数据库模型中的方法和对象一致,DataSet对象可以看作是数据库在应用代码里的映射,通过对DataSet对象的访问,可以完成对实际数据库的操作。

DataSet的对象模型如图所示。

DataSet对象模型中的各重要组件说明如下。

    1.DataRelationCollectionDataRelation

DataRelation对象用来描述DataSet里各表之间的诸如主键和外键的关系,它使一个DataTable中的行与另一个DataTable中的行相关联,也可以标识DataSet中两个表的匹配列。

DataRelationCollection是DataRelation对象的集合,用于描述整个DataSet对象里数据表之间的关系。

 2.ExtendedProperties

DataSet、DataTable和DataColumn全部具有ExtendedProperties属性。可以在其中加入自定义信息,例如用于生成结果集的SQL语句或生成数据的时间。

3.DataTableCollectionDataTable

在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(DataReader reader)方法:该方法通过参数里的IdataReader对象,把对应数据源里的数据装载到DataTable里,以便后继操作。

void Clear()方法:该方法用来清除DataTable里的数据,通常在获取数据前调用。

void Reset()方法:该方法用宋重置DataTabl对象。

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 AcceptChanges()方法:该方法用来向数据库提交上次执行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个DaaRow对象,同时通过for循环给其赋值。完成赋值后,将这5个DataRow对象添加到DataTable中。

(4)使用AcceptChanges方法,实现DataColumn和DataRow对象的更新。

(5)使用BeginEdit方法,开始编辑DataRow对象,使用EndEdit方法来表示编辑结束。

使用DataTable、DataColumn和DmaRow对象访问数据的一般方式有以下几种。

(1)使用Table名和Table索引来访问DataTable。为了提高代码的可读性,推荐使用Table名的方式来访问Table。代码如下:    

DataSet ds=new DataSet();
DataTable dt=new DataTble(" 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;
      }
}
时间: 2024-12-24 17:27:31

C#与数据库访问技术总结(十六)之 DataSet对象的相关文章

C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. 在下面这段代码里,首先根据连接字符串创建一个SqlConnecdon连接对象,并用此对象连接数据源:然后创建一个SqlCommand对象,并用此对象的ExecuteNonQuery方法执行不带返回结果集的SQL语句. 1 //连接字符串 2 3 private static string strCo

C#与数据库访问技术总结(十八)

ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库的一般步骤,而且说明了使用不同种类的ADO.NET组件集合访问数据库的一般步骤. 可以通过代码进一步了解这两种数据提供者访问方式的异同之处. 使用OLE DB.NET  Provider OLE DB的数据提供者可以访问Access和SQL等数据库,代码如下: //设置连接字符串 string db

ADO.NET数据库访问技术

ADO.net:数据库访问技术程序操作的数据都是变量或对象,这些东西都存在于内存中但是有很多的数据是存在数据库中的,数据库中的数据存在于硬盘上 作用:将数据库中的数据取到内存中来,可以让程序进行操作 将内存中的数据,写入到数据库中 1.using System.Data.SqlClient; //引用命名空间 2.建立 数据库连接类 string str = "server=.;database=Data0515;user=sa;pwd=123;";//连接字符串 SqlConnect

C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看

数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键关系 2.创建新的C#项目,创建 数据库连接类 与 数据库操作方法 a.引用数据库 using System.Data.SqlClient;    b.创建数据库连接类:先进行编写连接字符串,在实例化连接类 c.创建数据库操作方法(此处不是实例化类)    d.打开数据库 → 执行操作 → 关闭数据

数据库访问技术之JDBC

在了解JDBC之前呢,我们可以先对ODBC做一个回顾,以便于更好的理解JDBC.看名字也知道这两个关系不一般,他们实现了同样的功能,为应用程序连接和操作数据库提供支持.所以,我们先从ODBC开始. ODBC ODBC(Open Database Connectivity)是开放数据库互连的简称,是一种使用SQL的应用程序接口.它是一系列的规范和对数据库访问的API.那么API+SQL就可以执行对数据库的操作.它是不依赖于DBMS的,即通过ODBC可以以相同的方式连接大部分数据库.它包括了应用程序

Android官方ORM数据库Room技术解决方案:@Embedded内嵌对象(二)

Android官方ORM数据库Room技术解决方案:@Embedded内嵌对象(二) (一)附录1简介了Android Room的基本使用.在附录1例子中,User对象元素均为普通的Java基本数据类型,但是实际的开发中,通常建立的持久化存储对象复杂,且通常是结构化的Java对象,互相之间存在引用或者内嵌关系. Android Room支持数据库表Java对象通过注解符@Embedded内嵌一个Java对象.这样就像过去的ORM数据库一样,比如构造一个名为Info的Java对象,作为一个成员变量

C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例

DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data source=localhost;uid=sa;pwd=aspent;database=LOGINDB" string sqlstr=" select * from USER "; //利用构造函数,创建DataAdapter SqlDataAdapter da=new Sql

C#与数据库访问技术总结(十四)之DataAdapter对象

DataAdapter对象 DataAdapter对象主要用来承接Connection和DataSet对象. DataSet对象只关心访问操作数据,而不关心自身包含的数据信息来自哪个Connection连接到的数据源, 而Connection对象只负责数据库连接而不关心结果集的表示. 所以,在ASP.NET的架构中使用DataAdapter对象来连接Connection和DataSet对象. 另外,DataAdapter对象能根据数据库里的表的字段结构,动态地塑造DataSet对象的数据结构.

C#与数据库访问技术总结(七)综合示例

综合示例 说明:前面介绍了那么多,光说不练假把式,还是做个实例吧. 表:首先你要准备一张表,这个自己准备吧.我们以学生表为例. 1.ExecuteScalar方法 ExecuteScalar方法执行返回单个值的命令.例如,如果想获取Student数据库中表studentInfo的学生的总人数,则可以使用这个方法执行SQL查询: Select count(*) from studentInfo . (1) 建立Windows Application 应用程序 (2) 在Form1上添加一个按钮Bu