使用DataAdpater自动批量更新DataSet中的数据到数据库

本文介绍如何使用DataAdapter进行批量更新操作,通过设置DataRow的状态并指定UpdateCommand,实现高效的数据同步更新。文章还提供了完整的示例代码,并解释了不指定UpdateCommand时的默认行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用DataAdpater的批量更新,好处是不用写具体的sql脚本,尤其是做web服务这个优势非常吸引人。

ContractedBlock.gifExpandedBlockStart.gifCode
[WebMethod(Description = "Update服务提供的方法,将包含修改后数据的DateSet与本地数据库同步更新,成功返回更新的行数,失败返回-1。"), SoapHeader("currentUser")]   
public int Update(DataSet ds)   
{   
    
if (!ValidateUser(currentUser.UserName, currentUser.UserPass))   
    {   
        
return -1;   
    }   
    
else  
    {   
        
int res = 0;   
  
        
using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=xxxx;User ID=sa;Password=sa"))   
        {   
            sqlconn.Open();   
  
            
/ / //使用加强读写锁事务   
            SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);   
            
try  
            {   
           
                
foreach (DataRow dr in ds.Tables[0].Rows)   
                {   
                    
//所有行设为修改状态   
                    dr.SetModified();   
                }   
  
  
                
//为Adapter定位目标表   
                SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where 1=0 ", ds.Tables[0].TableName), sqlconn, tran);   
  
                SqlDataAdapter da 
= new SqlDataAdapter(cmd);   
  
              
                SqlCommandBuilder sqlCmdBuilder 
= new SqlCommandBuilder(da);   
                da.AcceptChangesDuringUpdate 
= false;   
  
  
                SqlCommand updatecmd 
= new SqlCommand(string.Format(" UPDATE [{0}] SET  [Name] = @Name WHERE ([ID] = @ID) ", ds.Tables[0].TableName));   
                
//不修改源DataTable   
                updatecmd.UpdatedRowSource = UpdateRowSource.None;   
                da.UpdateCommand 
= updatecmd;   
  
  
                da.UpdateCommand.Parameters.Add(
"@Name", SqlDbType.NVarChar, 50"Name");   
                da.UpdateCommand.Parameters.Add(
"@ID", SqlDbType.Int, 4, ds.Tables[0].Columns[0].ColumnName);   
  
  
  
                da.UpdateBatchSize 
= 10000;   
  
  
                res 
= da.Update(ds.Tables[0]);   
  
               
                ds.AcceptChanges();   
                tran.Commit();   
            
                sqlconn.Close();   
  
            }   
            
catch    
            {   
             
                tran.Rollback();   
                
return -1;   
            }   
  
  
        }   
        
return res;   
    }   
  
  
}  

 

注意:如果不指定DataAdapter的UpdateCommand ,则DataAdapter的CommandBuilder会自动构造默认的Update命令,这个更新是对所有列的更新。比如MSDN上那些例子。
 

转载于:https://www.cnblogs.com/lutzmark/archive/2009/10/16/1584419.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值