7.9 DataSet数据集对象

  DataSet是ADO.NET中的核心概念,作为初学者,可以把DataSet想象成虚拟的表,但是这个表不能用简单的表来表示,这个表可以想象成具有数据库结构的表,并且这个表是存放在内存中的。由于ADO.NET中DataSet的存在,开发人员能够屏蔽数据库与数据库之间的差异,从而获得一致的编程模型。

7.9.1 DataSet数据集基本对象
  DataSet能够支持多表、表间关系、数据库约束等,可以模拟一个简单的数据库模型。DataSet对象模型如图7-24所示。
DataSet对象模型
图7-24 DataSet对象模型
  上图简要的介绍了常用对象之间的构架关系。在DataSet中,主要包括TablesCollection、RelationsCollection、ExtendedProperties几个重要对象:

1.TablesCollection对象
  在DataSet中,表的概念是用DataTable来表示的。DataTable在System.Data中定义,它能够表示存储在内从中的一张表。它包含一个ColumnsCollection的对象,代表数据表的各个列的定义。同时,它也包含RowsCollection对象,这个对象包含DataTable中的所有数据。
2.RelationsCollection对象
  在各个DataTable对象之间,是通过使用RelationsCollection来表达各个DataTable对象之间的关系。RelationsCollection对象可以模拟数据库中的约束的关系。例如当一个包含外键的表被更新时,如果不满足主键-外键约束,这个更新操作就会失败,系统会抛出异常。
3.ExtendedProperties对象
  ExtendedProperties对象能够配置特定的信息,例如DataTable的密码,更新时间等等。

7.9.2 DataTable数据表对象
  DataTable是DataSet中的常用的对象,它和数据库中的表的概念十分相似。开发人员能够将DataTable想象成一个表。并且可以通过编程的方式创建一个DataTable表。示例代码如下所示。
+展开
-C#
            DataTable Table = new DataTable("mytable");//创建一个DataTable对象
            Table.CaseSensitive = false;//设置不区分大小写
            Table.MinimumCapacity = 100;//设置DataTable初始大小
            Table.TableName = "newtable"; //设置DataTable的名称

  上述代码创建了一个DataTable对象,并为DataTable对象设置了若干属性,这些属性都是常用的属性,其作用分别如下所示。
1)CaseSensitive:此属性设置表中的字符串是否区分大小写,若无特殊情况,一般设置为false,该属性对于查找,排序,过滤等操作有很大的影响。
2)MinimumCapacity:设置创建的数据表的最小的记录空间。
3)TableName:指定数据表的名称。
  一个表必须有一个列,而DataTable必须包含列。当创建了一个DataTable后,就必须向DataTable中增加列的。表中列的集合形成了二维表的数据结构。开发人员可以使用Columns集合的Add方法向DataTable中增加列,Add方法带有两个参数,一个是表列的名称,一个是该列的数据类型。示例代码如下所示。
+展开
-C#
            DataTable Table = new DataTable("mytable");//创建一个DataTable
            Table.CaseSensitive = false;//设置不区分大小写
            Table.MinimumCapacity = 100;//设置DataTable初始大小
            Table.TableName = "newtable";//设置DataTable的名称
            DataColumn Colum = new DataColumn();//创建一个DataColumn
            Colum = Table.Columns.Add("id"typeof(int));//增加一个列
            Colum = Table.Columns.Add("title"typeof(string));//增加一个列

  上述代码创建了一个DataTable和一个DataColumn对象,并通过DataTable的Columns.Add方法增加DataTable的列,这两列的列名和数据类型如下:
1)新闻ID:整型,用于描述新闻的编号。
2)新闻标题TITLE:字符型,用于描述新闻发布的标题。
注意:上述代码中,DataTable的列的数据类型使用的只能是.net中数据类型,因为其并不是真实的数据库,所以不能直接使用数据库类型,必须使用typeof方法把.net中的数据类型转换成数据库类型。

7.9.3 DataRow数据行对象
  在创建了表和表中列的集合,并使用约束定义表的结构后,可以使用DataRow对象向表中添加新的数据库行,这一操作同数据库中的INSERT语句的概念类似。插入一个新行,首先要声明一个DataRow类型的变量。使用NewRow方法能够返回一个新的DataRow对象。DataTable会根据DataColumnCollection定义的表的结构来创建DataRow对象。示例代码如下所示。
+展开
-C#
           DataRow Row = Table.NewRow();//使用DataTable的NewRow方法创建一个新DataRow对象

  上述代码使用DataTable的NewRow方法创建一个新DataRow对象,当使用该对象添加了新行之后,必须使用索引或者列名来操作新行,示例代码如下所示。
+展开
-C#
            Row[0] = 1;//使用索引赋值列
            Row[1] = "datarow";//使用索引赋值列

  上述代码通过索引来为一行中个各列赋值。从数组的语法可以知道,索引都是从第0个位置开始。将DataTable想象成一个表,从左到右从0开始索引,直到数值等于列数减1为止。为了提高代码的可读性,也可以通过直接使用列名来添加新行,示例代码如下所示。
+展开
-C#
            Row["bh"] = 1;//使用列名赋值列
            Row["title"] = "datarow";//使用列名赋值列

  通过直接使用列名来添加新行与使用索引添加新行的效果相同,但是通过使用列名能够让代码更加可读,便于理解,但是也暴露了一些机密内容(如列值)。在数据插入到新行后,使用Add方法将该行添加到DataRowCollection中,示例代码如下所示。
+展开
-C#
            Table.Rows.Add(Row);//增加列


7.9.4 DataView数据视图对象
  当需要显示DataRow对象中的数据时,可以使用DataView对象来显示DataSet中的数据。在显示DataSet中的数据之前,需要将DataTable中的数据填充到DataSet。值得注意的是,DataSet是DataTable的集合,可以使用DataSet的Add方法将多个DataTable填充到DataSet中去,示例代码如下所示。
+展开
-C#
            DataSet ds = new DataSet();//创建数据集
            ds.Tables.Add(Table); //增加表

填充完成后,可以通过DataView对象来显示DataSet数据集中的内容,示例代码如下所示。
+展开
-C#
            dv = ds.Tables["newtable"].DefaultView;//设置默认视图

  DataSet对象中的每个DataTable对象都有一个DefaultView属性,该属性返回表的默认试图。上述代码访问了名为newtable表的DataTable对象。开发人员能够自定义DataView对象,该对象能够筛选表达式来设置DataView对象的RowFilter属性,筛选表达式的值必须为布尔值。同时,该对象能够设置Sort属性进行排序,排序表达式可以包括列名或一个算式,示例代码如下所示。
+展开
-C#
            DataView dv = new DataView();//创建数据视图对象
            DataSet ds = new DataSet();//创建数据集
            ds.Tables.Add(Table); //增加数据表
            dv = ds.Tables["newtable"].DefaultView;//设置默认视图
            dv.RowFilter = "id" = "1";//设置筛选表达式
            dv.Sort = "id";//设置排序表达式

技巧:要显示DataSet中某项的值,可以使用语法ds.Tables[“表名称”].Rows[0][“列名称”].ToString()来显示,这种语法通常需要知道行的数目以免在访问数据时越界。

加支付宝好友偷能量挖...


评论(0)网络
阅读(141)喜欢(0)Asp.Net/C#/WCF