文章教程

9.8DataSet对象

8/31/2020 9:19:23 PM 人评论 次浏览

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不支持。

教程类别