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 并填充其内容所需的处理,从而提高应用程序的性能。