zoukankan      html  css  js  c++  java
  • 违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条 解决办法

    本文转载:http://www.cnblogs.com/litianfei/archive/2007/08/16/858866.html

    UpdateCommand和DeleteCommand出现DBConcurrencyException异常。调试提示:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条;或   违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条。

    这里的违反并发性:不是指多人编辑引起的并发。

    问题原因:

    在插入、更新或删除操作过程中当受影响的行数等于零时由 DataAdapter 引发的异常。

    可能的解决方法:

    1 检查是否设有主键。

    2 DeleteCommand的问题:检查是否含有自动编号字段(Access的自动编号字段可能会引发此异常);

       UpdateCommand的问题:检查更新的字段的原始值是否为空值(原始空值更新时可能会引发此异常)。
    3、多人并行操作也可能引发这样的异常。
    ----------------------
    如果你采用了BindingSource和TableAdapter的话,请参考下面的代码:

    -----------------------------------------------------------------------------------

    例程来源:人民邮电出版社出版的书《Visual Basic .NET 2005数据库编程技术与实例》

    详情请见:http://www.ptpress.com.cn/books/Book_Information.asp?BID=16271

    -----------------------------------------------------------------------------------

    Me.Validate()

    Me.职工基本信息BindingSource.EndEdit()

    Me.职工基本信息TableAdapter.Update(Me.工资管理DataSet.职工基本信息.GetChanges)

    Me.工资管理DataSet.职工基本信息.AcceptChanges()
    但是这样做后,导致了,dataset和数据库不一致的问题。是.AcceptChanges()
    语句导致。
    ----------------------
    也反应这样处理:http://software.it168.com/manual/ado.net/4-2-g.htm

    ?

    应该在RowUpdating事件里面处理一下,如果有并发行出现,就跳过 e.Status = UpdateStatus.Continue;

    状态 说明
    Continue 继续执行更新操作。
    ErrorsOccurred 中止更新操作并引发异常。
    SkipCurrentRow 忽略当前行并继续执行更新操作。
    SkipAllRemainingRows 中止更新操作但不引发异常。


    我们建议目前这样处理:
    if(this.工资管理DataSet.职工基本信息.GetChanges!=null)
    {Me.职工基本信息TableAdapter.Update(Me.工资管理DataSet.职工基本信息.GetChanges)}

     private void Form1_Load(object sender, EventArgs e)
            {
                string conn = "Data Source=.;Initial Catalog=TestDB;Integrated Security = SSPI;";
                using (SqlConnection connection = new SqlConnection(conn))
                {
                    connection.Open();
                    string select = "SELECT * FROM Table_1";
                    SqlDataAdapter da = new SqlDataAdapter(select, connection);
                    da.RowUpdating += new SqlRowUpdatingEventHandler(da_RowUpdating);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    DataTable dataTable = ds.Tables[0];

                    dataTable.Rows[0][1] = "9999";
                    // 删除第8行
                    
    //dataTable.Rows[1].Delete();

                    SqlCommand cmd = new SqlCommand();
                    SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(da);
                    cmd=objCommandBuilder.GetDeleteCommand();
                    da.Update(dataTable);
                    //if (dataTable.GetChanges() != null)
                    
    //{
                    
    //    da.Update(dataTable.GetChanges());
                    
    //}

                    
    //dataTable.AcceptChanges();

                    this.dataGridView1.DataSource = dataTable;

                }
            }

            void da_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
            {
                e.Status = UpdateStatus.Continue;
            }

             

  • 相关阅读:
    BZOJ 3506 机械排序臂 splay
    BZOJ 2843 LCT
    BZOJ 3669 魔法森林
    BZOJ 2049 LCT
    BZOJ 3223 文艺平衡树 splay
    BZOJ 1433 假期的宿舍 二分图匹配
    BZOJ 1051 受欢迎的牛 强连通块
    BZOJ 1503 郁闷的出纳员 treap
    BZOJ 1096 ZJOI2007 仓库设计 斜率优化dp
    BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
  • 原文地址:https://www.cnblogs.com/51net/p/3149793.html
Copyright © 2011-2022 走看看