一、UpdateCommand完成批量更新
注意:使用UpdateCommand进行批量更新时,如果此更新方法在事务里面,则必须将事务传递到SqlCommand 中,否则可能会因为事务交叉引起超时。

public override bool UpdateContractChargeBatch(List<ContractCharge> contractChargeLst) { SqlConnection conn = db.CreateConnection() as SqlConnection; conn.Open(); SqlDataAdapter sd = new SqlDataAdapter("SELECT TOP " + contractChargeLst.Count + " CONTRACTCHARGEID,DETAILID,MINJOBCOUNT,MAXJOBCOUNT,RATE,RATEADDRATIO FROM CCM_CONTRACTCHARGE WITH(NOLOCK)", conn); DataSet datasets = new DataSet(); SqlCommandBuilder scb = new SqlCommandBuilder(sd); sd.UpdateCommand = scb.GetUpdateCommand(); sd.UpdateCommand = new SqlCommand("UPDATE CCM_CONTRACTCHARGE SET DETAILID=@DETAILID,MINJOBCOUNT=@MINJOBCOUNT,MAXJOBCOUNT=@MAXJOBCOUNT,RATE=@RATE,RATEADDRATIO=@RATEADDRATIO WHERE CONTRACTCHARGEID=@CONTRACTCHARGEID", conn); sd.UpdateCommand.Parameters.Add("@DETAILID", SqlDbType.UniqueIdentifier, 16, "DETAILID"); sd.UpdateCommand.Parameters.Add("@CONTRACTCHARGEID", SqlDbType.UniqueIdentifier, 16, "CONTRACTCHARGEID"); sd.UpdateCommand.Parameters.Add("@MINJOBCOUNT", SqlDbType.Int, 4, "MINJOBCOUNT"); sd.UpdateCommand.Parameters.Add("@MAXJOBCOUNT", SqlDbType.Int, 4, "MAXJOBCOUNT"); sd.UpdateCommand.Parameters.Add("@RATE", SqlDbType.Float, 8, "RATE"); sd.UpdateCommand.Parameters.Add("@RATEADDRATIO", SqlDbType.Float, 8, "RATEADDRATIO"); sd.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; sd.UpdateBatchSize = 0; sd.Fill(datasets); for (int i = 0; i < contractChargeLst.Count; i++) { datasets.Tables[0].Rows[i].BeginEdit(); datasets.Tables[0].Rows[i]["DETAILID"] = contractChargeLst[i].DetailId; datasets.Tables[0].Rows[i]["CONTRACTCHARGEID"] = contractChargeLst[i].ContractChargeId; if (contractChargeLst[i].MinJobCount != int.MaxValue) { datasets.Tables[0].Rows[i]["MINJOBCOUNT"] = contractChargeLst[i].MinJobCount; } else { datasets.Tables[0].Rows[i]["MINJOBCOUNT"] = DBNull.Value; } if (contractChargeLst[i].MaxJobCount != int.MaxValue) { datasets.Tables[0].Rows[i]["MAXJOBCOUNT"] = contractChargeLst[i].MaxJobCount; } else { datasets.Tables[0].Rows[i]["MAXJOBCOUNT"] = DBNull.Value; } datasets.Tables[0].Rows[i]["RATE"] = contractChargeLst[i].Rate; datasets.Tables[0].Rows[i]["RATEADDRATIO"] = contractChargeLst[i].RateAddRatio; datasets.Tables[0].Rows[i].EndEdit(); } int reslut = sd.Update(datasets.Tables[0]); datasets.Tables[0].Clear(); sd.Dispose(); datasets.Dispose(); conn.Close(); return reslut == contractChargeLst.Count; }