使用DataAdapte 对数据库批量处理多个更新

      今天看书时看到了这部分的内容,感觉还是挺有用的,所以整理了一下,放到了这时,也希望能与有兴趣的朋友一起探讨一下。做了一个简单的示例,主要代码也已经粘出来了。  
        批量复制操作提供情报了把数据加载到目标数据库中的最高效方式,但对数据库更新过程进行定制的机会也最少。例如,批量复制操作只能把数据加载到目标数据库的一个表中。而在许多真实情况下,目标数据库都使用多个表,数据也常常需要执行定制的SQL语句或定制的存储过程。
       ADO.NET提供的DataAdapter对象就用于这种情况。DataAdapter对象可以用于提供定制的Update、Insert、Delete命令,以及使用DataTable。在DataAdpater上调用Update方式时,会遍历DataTable中的所有行,并根据每一行上设置的RowState标志解发相应的Update、Insert或Delete命令。
       在以前版本的 ADO.NET 中,使用 DataSet 中的更改来更新数据库时,DataAdapter 的 Update 方法每次更新数据库的一行。因为该方法循环访问指定 DataTable 中的行,所以,会检查每个 DataRow,确定是否已修改。如果该行已修改,将根据该行的 RowState 属性值调用相应的 UpdateCommand、InsertCommand 或 DeleteCommand。每一次行更新都涉及网络与数据库之间的双向数据传输。
       在 ADO.NET 2.0 中,DataAdapter 公开了 UpdateBatchSize 属性。将 UpdateBatchSize 设置为正整数值将使对数据库的更新以指定大小的批次进行发送。例如,如果将 UpdateBatchSize 设置为 10,会将 10 个独立的语句组合在一起并作为一批提交。将 UpdateBatchSize 设置为 0 将导致 DataAdapter 使用服务器可以处理的最大批次的大小。如果将其设置为 1,则禁用批量更新,因为此时每次发送一行。
执行非常大的批次可能会降低性能。因此,在实现应用程序之前,应测试最佳的批次大小设置。启用了批量更新后,DataAdapter 的 UpdateCommand、InsertCommand 和 DeleteCommand 的 UpdatedRowSource 属性值应设置为 None 或 OutputParameters。在执行批量更新时,命令的 FirstReturnedRecord 或 Both 的 UpdatedRowSource 属性值无效。
       下面的过程演示了DataAdapter 如何进行批量更新。它从NorthWind数据库的employees表中提取数据,更新他们的地址、国家、城市以及地区信息,再把这些修改过的信息保存回表中。使用的批量大小为3,在每个批处理中处理3个命令。如果要在以后处理更多的批处理记录,可以把这个数字改得更大一些,目前,Northwind数据库中的Employees表中只包含9个记录,把批量大小设置为3,可以对数据库服务器的3次请求完成对9个记录的更新。

 

 

None.gif protected   void  btnBulkCopy_Click( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        SqlDataAdapter EmpAdapter 
= new SqlDataAdapter();
InBlock.gif        DataTable EmpDT 
= new DataTable();
InBlock.gif        SqlConnection DBConSelect 
= new SqlConnection();
InBlock.gif        SqlConnection DBConUpdate 
= new SqlConnection();
InBlock.gif        SqlCommand SelectCommand 
= new SqlCommand();
InBlock.gif        SqlCommand UpdateCommand 
= new SqlCommand();
InBlock.gif
InBlock.gif        
//对查询与更新使用不同的连接对象
InBlock.gif
        DBConSelect.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
InBlock.gif        DBConUpdate.ConnectionString 
= ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
InBlock.gif
InBlock.gif
InBlock.gif        SelectCommand.CommandText 
= "select employeeid,address,city,region,country from employees";
InBlock.gif        SelectCommand.CommandType 
= CommandType.Text;
InBlock.gif        SelectCommand.Connection 
= DBConSelect;
InBlock.gif
InBlock.gif        UpdateCommand.CommandText 
= "Update employees set address=@address," + "city=@city,region=@region,country=@country";
InBlock.gif        UpdateCommand.CommandType 
= CommandType.Text;
InBlock.gif        UpdateCommand.Connection 
= DBConUpdate;
InBlock.gif
InBlock.gif        
//添加参数
InBlock.gif
        SqlParameter AddressParam;
InBlock.gif        AddressParam 
= new SqlParameter("@address", SqlDbType.VarChar, 15"Address");
InBlock.gif
InBlock.gif        SqlParameter CityParam;
InBlock.gif        CityParam 
= new SqlParameter("@city", SqlDbType.VarChar, 15"city");
InBlock.gif
InBlock.gif        SqlParameter Region;
InBlock.gif        Region 
= new SqlParameter("@region", SqlDbType.VarChar, 15"region");
InBlock.gif
InBlock.gif        SqlParameter CounParam;
InBlock.gif        CounParam 
= new SqlParameter("@country", SqlDbType.VarChar, 15"country");
InBlock.gif
InBlock.gif        UpdateCommand.Parameters.Add(AddressParam);
InBlock.gif        UpdateCommand.Parameters.Add(CityParam);
InBlock.gif        UpdateCommand.Parameters.Add(Region);
InBlock.gif        UpdateCommand.Parameters.Add(CounParam);
InBlock.gif
InBlock.gif        
//执行
InBlock.gif
        EmpAdapter.SelectCommand = SelectCommand;
InBlock.gif        EmpAdapter.UpdateCommand 
= UpdateCommand;
InBlock.gif
InBlock.gif        EmpAdapter.Fill(EmpDT);
InBlock.gif
InBlock.gif        DBConSelect.Close();
InBlock.gif
InBlock.gif        
//对所有记录里的相关字段进行赋值
InBlock.gif
        foreach (DataRow dr in EmpDT.Rows)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            dr[
"Address"= "SIPIC";
InBlock.gif            dr[
"city"= "Suzhou China";
InBlock.gif            dr[
"Region"= "Asia";
InBlock.gif            dr[
"Country"= "flower";
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        EmpAdapter.RowUpdated 
+= new SqlRowUpdatedEventHandler(EmpAdapter_RowUpdated);
InBlock.gif
InBlock.gif        lblCounter.Text 
= "";
InBlock.gif        EmpAdapter.UpdateBatchSize 
= 100;
InBlock.gif
InBlock.gif        UpdateCommand.UpdatedRowSource 
= UpdateRowSource.None;
InBlock.gif
InBlock.gif        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            DBConUpdate.Open();
InBlock.gif            EmpAdapter.Update(EmpDT);
InBlock.gif            
//更新后记录
InBlock.gif
            SelectCommand.Connection.Open();
InBlock.gif            reader 
= SelectCommand.ExecuteReader(CommandBehavior.CloseConnection);
InBlock.gif            GridView2.DataSource 
= reader;
InBlock.gif            GridView2.DataBind();
ExpandedSubBlockEnd.gif        }

InBlock.gif        
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            lblCounter.Text 
+= ex.Message + "<br>";
ExpandedSubBlockEnd.gif        }

InBlock.gif        
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (DBConUpdate.State == ConnectionState.Open)
InBlock.gif                DBConUpdate.Close();
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif
None.gif    
private   void  EmpAdapter_RowUpdated( object  sender, SqlRowUpdatedEventArgs args)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        lblCounter.Text 
+= "更新已执行了" + args.RowCount.ToString() + "<br>";
ExpandedBlockEnd.gif    }


 

转载于:https://www.cnblogs.com/qiangzi0303/archive/2007/04/06/702392.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值