9.8 DataSet对象
SqlDataReader对象可以读取数据库表中的记录,但是它必须与数据库创建连接,数据库断开连接时不能使用SqlDataReader对象。ADO.NET提供了DataSet对象,该对象在断开数据库连接时也可以进行读取操作。
9.8.1 DataSet工作原理
DataSet对象表示数据集,它可以保存数据库中读取的数据,在数据保存之后可以被直接操作。DataSet在ADO.NET断开连接的分布式数据中起到了重要作用,它是数据驻留在内存中的表示形式,不管数据源是什么,它都可以提供一致的关系编程模型。如图9-4所示为DataSet对象的工作原理。
图9-4 DataSet对象的工作原理
在图9-4中,当应用程序需要数据时会向服务器发出请求获取数据,服务器先将数据发送到DataSet中,然后再将数据集传递给客户端,客户端将数据集中的数据修改后,会统一将修改过的数据集发送到服务器,服务器接收并修改数据库中的数据。
9.8.2 创建DataSet对象
直接通过new关键字实例化DataSet对象时,可以通过以下两种形式进行创建。
DataSet ds = new DataSet(); //直接创建 DataSet ds = new DataSet("Customer"); //通过数据集名称创建
其中,第一种构造函数经常用到。在第二种构造函数中,在创建DataSet对象时需要传入数据集的名称。
9.8.3 DataSet对象的属性
DataSet对象包含一系列的属性和方法,只有将数据填充到该对象后,这个对象才能使用。如表9-9所示列举了DataSet对象的常用属性,并对这些属性进行说明。
表9-9 DataSet对象的常用属性
在表9-9中,Tables属性最经常被用到,通过该属性获取包含在DataSet中的表的集合。其中,ds.Tables[0]表示获取第一个表的数据,ds.Tables[1]表示获取第二个表的数据,其返回结果是一个DataTable对象。
9.8.4 DataSet填充数据
创建DataSet对象完毕后,可以调用相应的方法填充数据。DataSet填充或者修改数据时经常使用SqlDataAdapter对象。通过SqlDataAdapter对象填充DataSet对象的一般步骤如下。
(1)创建数据库连接对象。
(2)创建要执行的SQL语句或者存储过程。
(3)利用SQL语句和数据库连接对象创建SqlDataAdapter对象。
(4)向DataSet对象中填充数据。
【范例11】
更改9.7节中实验指导的内容,通过DataSet对象获取UserInfo表中的全部记录,并将获取到的记录显示到页面。步骤如下。
(1)创建SetData.aspx页面,在页面的表单元素中添加表格元素。其中,thead显示标题,tbody显示读取的内容,具体代码不再显示。
(2)在SetData.aspx.cs后台页面的Load事件中添加代码,通过SqlDataAdapter对象向DataSet填充数据。代码如下。
string connectionString = "Data Source=SJB; Initial Catalog=User Register; User ID=sa; Pwd = 123456"; SqlConnection connection = new SqlConnection(connectionString); //创建SqlCommand对象 string sql = "SELECT UserName, UserPass, UserMail, UserBirth, UserIntro FROM UserInfo"; //声明SQL SqlDataAdapter da = new SqlDataAdapter(sql, connection); //SQL语句和connection创建对象 DataSet ds = new DataSet(); da.Fill(ds);
(3)继续添加代码,遍历DataSet中的数据将其输出显示到页面。遍历数据时需要通过两个foreach语句,外层foreach语句遍历行,内层foreach语句遍历列。通过ds.Tables[0].Rows获取表中行的集合,通过ds.Tables[0].Columns获取表中列的集合。代码如下。
string result = ""; foreach (DataRow mDr in ds.Tables[0].Rows) { //遍历行 result += "<tr>"; foreach (DataColumn mDc in ds.Tables[0].Columns) { //遍历列 result += "<td>"; if (string.IsNullOrEmpty(mDr[mDc].ToString())) { result += "暂无"; } else { result += mDr[mDc].ToString(); } result += "</td>"; } result += "</tr>"; } tbody.InnerHtml = result; //输出数据添加到页面
(4)运行页面查看效果,具体效果图不再显示。
9.8.5 DataSet与SqlDataReader的区别
DataSet对象和SqlDataReader对象都可以保存数据,它们功能相似,但是并不能相互替换。下面分别从数据库连接、处理数据的速度和内存占用等方面进行介绍。
(1)数据库连接:DataSet对象可以不和数据库创建连接,把表全部读到SQL中的缓冲池,并断开和数据库的连接;而SqlDataReader对象必须与数据库进行连接,读取表时,只能向前读取,读取完毕后由用户决定是否断开连接。
(2)处理数据的速度:DataSet对象读取和处理数据的速度较慢,而SqlDataReader读取和处理数据的速度较快。
(3)更新数据库:DataSet对象对数据集中的数据更新后,可以把数据库中的数据更新;而SqlDataReader只能读取数据,不能对数据库中的数据更新。
(4)内存占用:DataSet对象占用内存较多;而SqlDataReader对象占用内存较少。
(5)是否支持分页和排序功能:DataSet支持分页和排序;而SqlDataReader不支持。