您的位置:首页 > 数据库

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

2009-10-16 11:57 573 查看
使用DataAdpater的批量更新,好处是不用写具体的sql脚本,尤其是做web服务这个优势非常吸引人。

[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上那些例子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐