本文轉載: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; }