2010-03-26 14 views
0

MS 액세스 db, 항목을 표시하는 datagridview, db의 예/아니요 열을 나타내는 두 개의 확인란 열 및 새로 고침/del 단추가 있습니다.왜 동시성 위반 오류가 발생합니까?

체크 박스가 수정되지 않은 행을 삭제하려고하면 행 디 레트가 제대로 처리되고 확인란 값을 수정하고 새로 고침 버튼을 누른 다음 삭제해도 행이 잘 삭제됩니다.

그러나 확인란의 값을 수정 한 직후에 행을 삭제하려고하면 동시성 위반 예외 오류가 발생합니다.

체크 박스 값이 변경 코드 :

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 

     if (dataGridView1.Columns[e.ColumnIndex].Name == "sales") 
     { 

      DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[e.RowIndex].Cells["sales"]; 
      bool _pSale = (Boolean)checkCell.Value; 

      string connstring = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", Path.Combine(Directory.GetCurrentDirectory(), "MyDatabase01.accdb")); 
      OleDbConnection conn = new OleDbConnection(connstring); 
      conn.Open(); 

      string sqlqry = "UPDATE Items SET pSale = " + _pSale + " WHERE p_Name = '" + this._pName + "'"; 
      OleDbCommand upd = new OleDbCommand(sqlqry, conn); 
      upd.ExecuteNonQuery(); 
      conn.Close(); 
      //dataGridView1.Invalidate(); 

     } 
} 

새로 고침 버튼 코드 :

public void Refreshdgv() 
     { 
      this.categoriesItemsBindingSource.EndEdit(); 
      this.itemsTableAdapter.Fill(myDatabase01DataSet.Items); 
      this.dataGridView1.Refresh(); 
     } 

삭제 버튼 코드 :

private void delBtn_Click(object sender, EventArgs e) 
    { 
      try 
      { 

       int cnt = dataGridView1.SelectedRows.Count; 
       for (int i = 0; i < cnt; i++) 
       { 
        if (this.dataGridView1.SelectedRows.Count > 0) 
        { 
         this.dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index); 
        } 
       } 


       this.Validate(); 
       this.categoriesItemsBindingSource.EndEdit(); 
       this.itemsTableAdapter.Update(this.myDatabase01DataSet.Items); 
       this.myDatabase01DataSet.AcceptChanges(); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
    } 

내가 Refreshdgv를 (호출 할 수 있습니다이 문제를 해결하려면) 방법 dataGridView1.Invalidate() 대신에. 하지만 각 체크 박스를 클릭 할 때 dgv 새로 고침을 원하지 않습니다!

답변

1

데이터 세트의 삭제 명령이 원래 값을 확인하는 것 같습니다. CellValueChanged 이벤트에서 데이터베이스를 수동으로 업데이트하므로 데이터베이스의 값이 DataSet의 원래 값과 일치하지 않습니다. DataSet에서 update 명령을 사용하도록 CellValueChanged 이벤트를 수정하면 Delete를 호출 할 때 값은이됩니다.

또는 덜 배타적 인 where 절 (예 : WHERE KeySegment0 = @keySegment0 AND KeySegment1 = @keySegment1 ...)을 사용하도록 delete 명령을 변경할 수 있습니다.

+0

감사합니다. 문제가 직접 수동으로 db를 업데이트하면 안됩니다. 나는 dgv cell changed tableadapter update 명령으로 update 코드를 바꿨다. – DanSogaard

0

데이터의 유효성을 검사하고 업데이트하십시오. 그런 다음 데이터 세트를 지우고 채우십시오. 그러면 변경 사항이있을 때마다 DataGrid가 새로 고쳐집니다.

관련 문제