- 爱易网页
 
                        - 
                            C#教程
 
                        - 高手请问, 
 
                         
                    
                    
                    日期:2014-05-19  浏览次数:21284 次 
                    
                        
                         高手请教,在线等急!!!!!!!!!!!!!
本地数据表(dataset.table)利用adapter   更新数据库,很慢,有没有好的方法提高效率。
------解决方案--------------------
批量复制操作提供情报了把数据加载到目标数据库中的最高效方式,但对数据库更新过程进行定制的机会也最少。例如,批量复制操作只能把数据加载到目标数据库的一个表中。而在许多真实情况下,目标数据库都使用多个表,数据也常常需要执行定制的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个记录的更新。 
  
   
  
   
  
 protected void btnBulkCopy_Click(object sender, EventArgs e) 
     { 
         SqlDataAdapter EmpAdapter = new SqlDataAdapter(); 
         DataTable EmpDT = new DataTable(); 
         SqlConnection DBConSelect = new SqlConnection(); 
         SqlConnection DBConUpdate = new SqlConnection(); 
         SqlCommand SelectCommand = new SqlCommand(); 
         SqlCommand UpdateCommand = new SqlCommand(); 
  
         //对查询与更新使用不同的连接对象 
         DBConSelect.ConnectionString = ConfigurationManager.ConnectionStrings[ "ConnectionString "].ConnectionString; 
         DBConUpdate.ConnectionString = ConfigurationManager.ConnectionStrings[ "ConnectionString "].ConnectionString; 
  
  
         SelectCommand.CommandText =  "select employeeid,address,city,region,country from employees "; 
         SelectCommand.CommandType = CommandType.Text; 
         SelectCommand.Connection = DBConSelect; 
  
         UpdateCommand.CommandText =  "Update employees set address=@address, " +  "city=@city,region=@region,country=@country "; 
         UpdateCommand.CommandType = CommandType.Text; 
         UpdateCommand.Connection = DBConUpdate; 
  
         //添加参数 
         SqlParameter AddressParam; 
         AddressParam = new SqlParameter( "@address ", SqlDbType.VarChar, 15,  "Address "); 
  
         SqlParameter CityParam; 
         CityParam = new SqlParameter( "@city ", SqlDbType.VarChar, 15,  "city "); 
  
         SqlParameter Region; 
         Region = new SqlParameter( "@region ", SqlDbType.VarChar, 15,  "region "); 
  
         SqlParameter CounParam; 
         CounParam = new SqlParameter( "@country ", SqlDbType.VarChar, 15,  "country "); 
  
         UpdateCommand.Parameters.Add(AddressParam); 
         UpdateCommand.Parameters.Add(CityParam); 
         UpdateCommand.Parameters.Add(Region); 
         UpdateCommand.Parameters.Add(CounParam); 
  
         //执行 
         EmpAdapter.SelectCommand = SelectCommand; 
         EmpAdapter.UpdateCommand = UpdateCommand; 
  
         EmpAdapter.Fill(EmpDT); 
  
         DBConSelect.Close(); 
  
         //对所有记录里的相关字段进行赋值 
         foreach (DataRow dr in EmpDT.Rows)