当前位置:嗨网首页>书籍在线阅读

12-非连接模式下更新数据

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

18.4.2 非连接模式下更新数据

DataAdapter对象的Update方法执行后,把修改过的DataSet数据更新至数据源。非连接模式下通过DataSet对象更新数据源数据的步骤如下。

(1)通过DataAdapter对象用数据源中的数据填充DataSet对象中的每个DataTable对象。

(2)通过添加、更新或删除DataRow对象更改单个DataTable对象中的数据。

(3)调用DataAdapter对象的Update方法,把DataSet对象中已修改的数据更新至数据源。

【范例18-8】 使用DataSet对象更新数据源数据。

(1)在Visual Studio 2013中打开Windows应用程序项目“slipmanage”。

(2)更改【范例18-6】Slipway类中addSlipway和updateSlipway的方法,代码如下(代码18-8-1.txt)。

01  public int addSlipway(Slipway slipway)      // 添加slipway对象
02  {        
03        string sql = "select * from Slipway ";
04        DataSet sqlread = new DataSet();
05        SqlDataAdapter da = new SqlDataAdapter(sql, Conn.conn);
06        da.Fill(sqlread, "Slipway");
07        DataTable dt = sqlread.Tables["Slipway"];
08        DataRow dr = dt.NewRow();
09        dr["name"]=slipway.name;
10        dr["volume"] = slipway.volume;  
11        dt.Rows.Add(dr);
12        SqlCommandBuilder scb = new SqlCommandBuilder(da);
13        int val= da.Update(sqlread, "Boat");
14        return val;
15  }
16  public int updateSlipway(Slipway slipway)   // 更新slipway对象
17  {                                           // 获取所有船只信息,并存储到DataSet对象中
18       string sql = "select * from Boat ";
19       int val=0;
20       DataSet sqlread = new DataSet();
21       SqlDataAdapter da = new SqlDataAdapter(sql, Conn.conn);       
22       da.Fill(sqlread, "Boat");
23       DataTable dt = sqlread.Tables["Boat"];
24       if (dt.Rows.Count>0)   {    //清除原来停靠在slipway船台上船只的船台号码信息
25          for (int i = 0; i < dt.Rows.Count;i++ )   {
26            if(dt.Rows[i]["slipwayNo"] ==(object)slipway.id)   {
27                 dt.Rows[i]["slipwayNo"]=null;   
28                 dt.Rows[i]["validity"] = DBNull.Value;       
29             }
30           }
31        SqlCommandBuilder scb = new SqlCommandBuilder(da);
32        da.Update(sqlread,"Boat");
33      }
34      if (dt.Rows.Count>0)   {    // 更新最新停靠在slipway船台上船只的船台号码信息
35          foreach (Boat boat in slipway.Boat)   {
36             string temp = boat.StateRegistrationNo;
37             for (int i = 0; i < dt.Rows.Count;i++ )   {
38               if (temp == (dt.Rows[i]["stateRegistrationNo"].ToString()))   {
39                 dt.Rows[i]["slipwayNo"] = slipway.id;   
40                 dt.Rows[i]["validity"] =DBNull.Value;       
41                 }
42              }
43          }
44        SqlCommandBuilder scb = new SqlCommandBuilder(da);
45        val = da.Update(sqlread, "Boat");
46      }
47     if (val == 0)
48      {
49         return -1;
50      }
51    return 1;
52  }

【代码详解】

与【范例18-6】一样,上述Slipway类中的addSlipway方法用来往数据库的船台信息表slipway中添加已有船台信息(通过参数slipway传递)。updateSlipway方法用来更新特定船台(通过参数slipway传递)的停靠船只信息,它先清除该船台原来停靠船只的船台信息为空,再把该船台最新停靠船只的船台信息依次更新为该船台号码。updateSlipway方法通过执行SQL语句“select * from Boat ;”检索Boat表中的船只信息,程序中的下面三条语句:

SqlDataAdapter da = new SqlDataAdapter(sql, Conn.conn);
DataSet sqlread = new DataSet();
da.Fill(sqlread, "Boat");

通过调用DataAdapter对象da的Fill方法把检索到的船只信息填充到DataSet对象sqlread中。程序中的下面这条语句:

DataTable dt = sqlread.Tables["Boat"];

把sqlread对象中“Boat”表的内容暂赋给Table对象dt(即通过Table对象dt访问“Boat”表内容),并通过下面的for循环:

for (int i = 0; i < dt.Rows.Count;i++ )
{ 
        if(dt.Rows[i]["slipwayNo"] ==(object)slipway.id)  //判断dt表中船只原来是否停靠在slipway船台对象上
        {
                dt.Rows[i]["slipwayNo"]= DBNull.Value;    //船只的船台停靠信息更新为空
        }
}

先把dt表中原来停靠在slipway对象上的船只的船台停靠信息更新为空,再通过下面的for循环:

foreach (Boat boat in slipway.Boat)  //处理最新停靠在slipway船台上的船只列表slipway.Boat
{
        string temp = boat.StateRegistrationNo; //获取目前停靠在slipway船台上船只的注册号信息
        for (int i = 0; i < dt.Rows.Count;i++ )
        {                                 //根据注册号信息在dt表中找到停靠在slipway船台上的船只
                if (temp == (dt.Rows[i]["stateRegistrationNo"].ToString()))  
                dt.Rows[i]["slipwayNo"] = slipway.id;    //船只的船台停靠信息更新为slipway对象的船台号
        }
}

逐个处理最新停靠在slipway船台对象上的船只信息:根据注册号信息“stateRegistrationNo”寻找dt表中对应的船只信息,并把dt表中对应的船只信息更新为slipway对象的船台号。下面的语句:

SqlCommandBuilder scb = new SqlCommandBuilder(da);
da.Update(sqlread, "Boat");

通过DataAdapter对象da把已经修改过的dt表中的信息(即DataSet对象sqlread中的Boat表信息)更新到数据源中。

比较【范例18-6】和【范例18-8】中的updateSlipway方法可以看出,连接模式下,数据连接打开后,直接通过Command对象执行对数据源数据的更新;非连接模式下,先把数据源中需要更新的数据检索出来,暂存到本地的DataSet对象中直接修改,再通过DataAdapter对象把DataSet对象中已修改的数据更新至数据源。如果需要更新的数据量不大,使用连接模式不仅可以节省 DataSet 所使用的内存,还将省去创建 DataSet 并填充其内容所需的处理,从而提高应用程序的性能。