違反並發性: 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;
        }

 

         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM