积极答复者
怪事SqlDataAdapter更新出错

问题
-
最近想做个统计为了减少SQL服务器压力想用DataSet保存到Cache内到一定时间使用SqlDataAdapter更新
可是更新不到几次就出现 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
又没对要更新数据添加或删除过 怎么会出现 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
真搞不懂- 已移动 Sheng Jiang 蒋晟 2009年9月16日 15:43 SQL Server问题 (发件人:Visual Studio 相关讨论)
答案
-
参考这个例子
DataSet ds = new DataSet();
SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["blogsConnectionString"].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter("select i,d from t",cn);
cn.Open();
da.Fill(ds);
da.UpdateCommand = new SqlCommand("update t set d=@d, i=@i where d=123");
da.UpdateCommand.Parameters.Add("@i", SqlDbType.VarChar,50, "i");
da.UpdateCommand.Parameters.Add("@d", SqlDbType.Int, int.MaxValue, "d");
DataTable dt = ds.Tables[0];
var drs = dt.Select("d='123'");
foreach (DataRow r in drs)
{
r.BeginEdit();
r["d"] =456;
r.EndEdit();
}
da.Update(ds); ds.AcceptChanges();
cn.Close();- 已建议为答案 mldark 2009年9月19日 8:55
- 已标记为答案 Hong-Gang Chen - MSFTModerator 2009年9月22日 9:11
-
你好,这种情况一般是由于自动生成的 UpdateCommand 把所有列都带入了 Where 条件,当你的 SelectCommand 不正确,或是需要更新的某行数据在提交前已被别处修改,这样造成 Where 条件不成立引发“UpdateCommand 影响了预期 1 条记录中的 0 条”,你可以结合Sql Profile 来判断错误是由于上面哪两种方式造成的,并修正。另外你通过删除UpdateCommand Where 条件中除主键以外的所有条件也能修正此错误。
知识改变命运,奋斗成就人生!- 已建议为答案 mldark 2009年9月19日 8:55
- 已标记为答案 Hong-Gang Chen - MSFTModerator 2009年9月22日 9:11
全部回复
-
参考这个例子
DataSet ds = new DataSet();
SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["blogsConnectionString"].ConnectionString);
SqlDataAdapter da = new SqlDataAdapter("select i,d from t",cn);
cn.Open();
da.Fill(ds);
da.UpdateCommand = new SqlCommand("update t set d=@d, i=@i where d=123");
da.UpdateCommand.Parameters.Add("@i", SqlDbType.VarChar,50, "i");
da.UpdateCommand.Parameters.Add("@d", SqlDbType.Int, int.MaxValue, "d");
DataTable dt = ds.Tables[0];
var drs = dt.Select("d='123'");
foreach (DataRow r in drs)
{
r.BeginEdit();
r["d"] =456;
r.EndEdit();
}
da.Update(ds); ds.AcceptChanges();
cn.Close();- 已建议为答案 mldark 2009年9月19日 8:55
- 已标记为答案 Hong-Gang Chen - MSFTModerator 2009年9月22日 9:11
-
你好,这种情况一般是由于自动生成的 UpdateCommand 把所有列都带入了 Where 条件,当你的 SelectCommand 不正确,或是需要更新的某行数据在提交前已被别处修改,这样造成 Where 条件不成立引发“UpdateCommand 影响了预期 1 条记录中的 0 条”,你可以结合Sql Profile 来判断错误是由于上面哪两种方式造成的,并修正。另外你通过删除UpdateCommand Where 条件中除主键以外的所有条件也能修正此错误。
知识改变命运,奋斗成就人生!- 已建议为答案 mldark 2009年9月19日 8:55
- 已标记为答案 Hong-Gang Chen - MSFTModerator 2009年9月22日 9:11
-
如果你在DataTable 添加数据,没有设定主键(如果主键是自动生成的),Update后,你又删除或修改该记录,因为DataTable没有主键,程序集不知道删除或修改那条记录,就抛出此异常了(如果保存后没有AcceptChange,也会产生异常)
- 已建议为答案 SQL STUDIO 2009年9月27日 13:57