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

應該在RowUpdating事件裏面處理一下,如果有併發行出現,就跳過 e.Status = UpdateStatus.Continue;

應該在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;
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章