违反并发性: 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;
        }

 

         

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值