DataSet对象是ADO.NET的核心,基于DataSet的数据模型才使得ADO.NET实现离线式数据操作模型。DataSet是存在于内存中的数据库,是专门用来处理数据保存体中读出的数据。它的优点就是离线式的,一点读取到数据源中的数据后,就在内存中建立数据库的副本,在此之后的操作,直到执行更新命令为止,所有的操作都是在内存中完成的。不管底层的数据库是哪种形式,DataSet的行为都是一致。
8.1.2ADO.NET的DataSet数据模型
因为DataSet可以看做是内存中的数据库,也因此可以说DataSet是数据表的集合,它可以包含任意多个数据表(DataTable),而且每一DataSet中的数据表(DataTable对应一个数据源中的数据表(Table)或是数据视图(View)。数据表实质是又行(DataRow)和列(DataColumn)组成的集合为了保护内存中数据记录的正确性,避免并发访问时的读写冲突,DataSet对象中的DataTable负着维护每一条记录,分别保存记录的初始状态和当前状态。从这里可以看出DataSet是与只能存放单张数据表的Recordset是截然不同的概念。
DataSet对象的结构模型如下图8.1所示:
通过上图的分析可知,DataSet对象结构还是非常复杂的,在DataSet对象的下一层中是DataTableCollection对象、DataRelationCollection对象和ExtendedProperties对象。上文已经说过,每一个DataSet对象是由若干个DataTable对象组成。DataTableCollection就是管理DataSet中的所有DataTable对象。表示DataSet中两个DataTable对象之间的父/子关系是DataRelation对象。它使一个DataTable 中的行与另一个DataTable中的行相关联。这种关联类似于关系数据库中数据表之间的主键列和外键列之间的关联。DataRelationCollection对象就是管理DataSet中所有DataTable之间的DataRelation关系的。在DataSet中DataSet、DataTable和DataColumn都具有ExtendedProperties属性。ExtendedProperties其实是一个属性集(PropertyCollection),用以存放各种自定义数据,如生成数据集的SELECT语句等。
通过上面几节中的介绍和本节中的分析,我们可以总结出DataSet对象的三大特性:
(1) 独立性。DataSet独立于各种数据源。
(2) 离线(断开)和连接。
(3) DataSet对象是一个可以用XML形式表示的数据视图,是一种数据关系视图。
在实际应用中,DataSet使用方法一般有三种:
(1) 把数据库中的数据通过DataAdapter对象填充DataSet。
(2) 通过DataAdapter对象操作DataSet实现更新数据库。
(3) 把XML数据流或文本加载到DataSet。
下面我们通过一个实例来学习DataSet对象的使用方法。
启动Visual Studio.NET 2003,新建一个ASP.NET Web应用程序,命名为Adodotnet。如图8.2所示。
图8.2 新建Adodotnet Web应用程序
本实例需要数据库,我们使用Access 2003 新建一个StudentInfor.mdb数据库,将该数据库保存到Adodotnet Web项目的文件下。该数据库包含一个数据表student,字段属性如图8.3所示。
图8.3 字段属性
便于显示效果需要,我们虚拟一些数据,如图8.4所示。
图8.4student数据表中记录内容
首先新建一个Web窗体,命名为DataSet.aspx, 从工具箱中的Web控件列表里选择DataGrid控件,并添加到DataSet.aspx内,DataGrid控件的ID为" DataGrid1",该控件是数据库操作控件,将在下一章中详细介绍,如图8.5所示。
图8.5 DataSet.aspx设计窗口中的DataGrid控件
切换至DataSet.aspx的HTML窗口,我们可以看到主要HTML代码片段如下:
<form id="Form1" method="post" runat="server">
<asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 8px;
POSITION: absolute; TOP: 8px" runat="server"></asp:datagrid>
</form>
进入DataSet.aspx 的逻辑编码窗口,添加逻辑代码。DataSet.aspx.vb的内容如下:
'-----code begin-------
Imports System.Data
Imports System.Web
Public Class DataSet
Inherits System.Web.UI.Page
#Region " Web 窗体设计器生成的代码 "
'此处省略了窗体设计器生成的代码,以节约篇幅
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
Dim connstr As String'声明数据库连接字符
Dim mycon As OleDb.OleDbConnection
'因为使用Aeecss数据库,所以声明OleDConnention对象
Dim mycmd As OleDb.OleDbDataAdapter
'声明DataAdapter对象
Dim mysql As String
'声明Command命令的 SQL字符串
Try
connstr = "provider=microsoft.jet.oledb.4.0;data source=" + Server.MapPath(".") + "\StudentInfor.mdb"
'为连接字符串赋值
mycon = New OleDb.OleDbConnection(connstr)
'实例化Connection对象
mysql = "Select * from student"
'设置SQL语句,即查询数据库中所有内容
mycmd = New OleDb.OleDbDataAdapter(mysql, mycon)
'实例化DataAdapter对象
Dim mydataset As Data.DataSet
'声明DataSet对象
mydataset = New Data.DataSet
'实例化DataSet对象
mycmd.Fill(mydataset, "student")
'利用DataAdapter对象的Fill方法填充mydataset对象,
'填充到mydataset中的数据表名称为student
DataGrid1.DataSource = mydataset
'DataGrid1控件添加数据源,即mydataset对象
DataGrid1.DataMember = "student"
'DataGrid1控件指定数据表
DataGrid1.DataBind()
Catch ex As Exception
'如果出现错误,输出错误信息
Response.Write("程序出现错误, 错误信息如下: <br>" & ex.Message)
Finally
mycon.Close() '关闭数据连接
End Try
End Sub
End Class
'------code end -------
保存编译后,通过浏览器预览如图8.6所示。
图8.6DataSet.aspx实例运行结果