none
怪事SqlDataAdapter更新出错 RRS feed

  • 问题

  • 最近想做个统计为了减少SQL服务器压力想用DataSet保存到Cache内到一定时间使用SqlDataAdapter更新
    可是更新不到几次就出现 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
    又没对要更新数据添加或删除过 怎么会出现  违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
    真搞不懂
    • 已移动 Sheng Jiang 蒋晟 2009年9月16日 15:43 SQL Server问题 (发件人:Visual Studio 相关讨论)
    2009年9月16日 15:04

答案

  • 如果sqldataadapeter的updatacommand是自动生成的 这种情况很正常的
    用手写sql更新sqldataadapeter updatacommand实例 
    2009年9月16日 15:16

  • 参考这个例子
    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();      
    2009年9月17日 18:12
  • 你好,这种情况一般是由于自动生成的 UpdateCommand  把所有列都带入了 Where 条件,当你的 SelectCommand 不正确,或是需要更新的某行数据在提交前已被别处修改,这样造成 Where 条件不成立引发“UpdateCommand 影响了预期 1 条记录中的 0 条”,你可以结合Sql Profile 来判断错误是由于上面哪两种方式造成的,并修正。另外你通过删除UpdateCommand Where 条件中除主键以外的所有条件也能修正此错误。
    知识改变命运,奋斗成就人生!
    2009年9月18日 1:15

全部回复

  • 如果sqldataadapeter的updatacommand是自动生成的 这种情况很正常的
    用手写sql更新sqldataadapeter updatacommand实例 
    2009年9月16日 15:16
  • 那里有 手写sql更新sqldataadapeter updatacommand实例 
    能否写个简单示例
    2009年9月17日 17:23

  • 参考这个例子
    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();      
    2009年9月17日 18:12
  • 你好,这种情况一般是由于自动生成的 UpdateCommand  把所有列都带入了 Where 条件,当你的 SelectCommand 不正确,或是需要更新的某行数据在提交前已被别处修改,这样造成 Where 条件不成立引发“UpdateCommand 影响了预期 1 条记录中的 0 条”,你可以结合Sql Profile 来判断错误是由于上面哪两种方式造成的,并修正。另外你通过删除UpdateCommand Where 条件中除主键以外的所有条件也能修正此错误。
    知识改变命运,奋斗成就人生!
    2009年9月18日 1:15
  • 如果你在DataTable 添加数据,没有设定主键(如果主键是自动生成的),Update后,你又删除或修改该记录,因为DataTable没有主键,程序集不知道删除或修改那条记录,就抛出此异常了(如果保存后没有AcceptChange,也会产生异常)
    • 已建议为答案 SQL STUDIO 2009年9月27日 13:57
    2009年9月27日 13:57