2010-08-02 26 views
3

我是c#的新手,並試圖將datagridview綁定到visual studio 2010中的mssql數據庫。 數據綁定可以,一切似乎都有效。除了少數幾個莫名其妙的錯誤:併發衝突:UpdateCommand影響了預期的1條記錄中的0 0

我得到這個問題的錯誤後: 更新同一行的2倍, 刪除新插入的行, 更新行時的其他行已被刪除(文字修改後DeleteCommand)

我在Google上找到的所有解決方案都不適合我。我希望有人能幫助我。這裏是TE代碼:

private void fillDatagrid() 
     { 
      //fill datagrid ADO.NET 
      conn = new SqlConnection(TestApp.Properties.Settings.Default.TestdatabaseConnectionString); 
      cmd = conn.CreateCommand(); 
      conn.Open(); 
      cmd.CommandText = "SelectFrom"; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("@table", SqlDbType.NVarChar, 50).Value = "Countries"; 
      cmd.Parameters.Add("@filters", SqlDbType.NVarChar, 300).Value = ""; 

      adapt = new SqlDataAdapter(cmd); 
      dt = new DataTable(); 
      adapt.Fill(dt); 
      dt.TableName = "Countries"; 

      conn.Close(); 

      BindingSource src = new BindingSource(); 
      src.DataSource = dt; 
      dt.RowChanged += new DataRowChangeEventHandler(dt_RowChanged); 

      dgDatabaseGrid.DataSource = src; 
      dgDatabaseGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); 
      //dgDatabaseGrid.RowValidating += new DataGridViewCellCancelEventHandler(dgDatabaseGrid_RowValidating); 

      //disable columns: 
      dgDatabaseGrid.Columns[0].Visible = false; 
      dgDatabaseGrid.Columns["date_insert"].Visible = false; 
      dgDatabaseGrid.Columns["user_insert"].Visible = false; 
      dgDatabaseGrid.Columns["date_change"].Visible = false; 
      dgDatabaseGrid.Columns["user_change"].Visible = false; 
      dgDatabaseGrid.Columns["deleted"].Visible = false; 

      //auto size last column 
      dgDatabaseGrid.Columns["remarks"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 


      SqlCommandBuilder cb = new SqlCommandBuilder(adapt); 
     } 

     void dt_RowChanged(object sender, DataRowChangeEventArgs e) 
     { 
      try 
      { 
       adapt.Update(dt); 
      } 
      catch (SqlException ex) 
      { 
       Debug.WriteLine(ex.Message); 
      } 
     } 

private void dgDatabaseGrid_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) 
     { 
      if (!e.Row.IsNewRow) 
      { 


       DialogResult response = MessageBox.Show("Are you sure?", "Delete row?", 
            MessageBoxButtons.YesNo, 
            MessageBoxIcon.Question, 
            MessageBoxDefaultButton.Button2); 

       if (response == DialogResult.Yes) 
       { 

        //ipv delete --> deleted=1 
        conn.Open(); 
        cmd = conn.CreateCommand(); 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.CommandText = "DeleteFrom"; 
        cmd.Parameters.Add("@table", SqlDbType.NVarChar, 50).Value = "Countries"; 
        cmd.Parameters.Add("@id", SqlDbType.Int).Value = e.Row.Cells[0].Value; 
        cmd.ExecuteNonQuery(); 
        conn.Close(); 


        //delete from datagrid: 
        dt.Rows[dgDatabaseGrid.SelectedCells[0].RowIndex].Delete(); 

       } 

       //always cancel! 
       e.Cancel = true; 

      } 
     } 

回答

1

更新同一行的2倍

是否有一個時間戳列(或改變任何其他列/填充數據庫服務器上)後?

當內存中的行與Db中的行不同時,可能會發生問題。並且因爲您使用SP作爲SelectCmd,所以更新後可能沒有更新(可能)。

刪除新插入的行

相似後,引起了不更新行過程的其他行已被刪除(文字修改的DeleteCommand後插入

後獲取新的ID )

完全不清楚。
但是,爲什麼你手動刪除行,而不是將它留給adapt.Update()?你確定沒有兩個方法都被執行嗎?

+0

你的回答正是我應該知道的,給我足夠的線索來解決我的問題。謝謝Henk。 – 2015-12-12 16:09:27

6

我知道這是很晚了,但也許它會幫助別人。

對您的代碼以下更改:

try 
{ 
    adapt.Update(dt); 

這裏寫這些線,對我希望它會爲你工作使用可變

Me.yourTableAdapter.Update(Me.yourDataSet.yourTable) 
    Me.yourDataSet.youTable.AcceptChanges() 
    Me.yourTableAdapter.Fill(Me.yourDataSet.yourTable) 

它的工作就像一個魅力。

} 
catch (SqlException ex) 
{ 
    Debug.WriteLine(ex.Message); 
} 
+0

不錯!這幫助我解決了我的問題,但是,編輯以獲得更好的結果。填充已包含數據的dataset.table將顯示重複的行。 – CularBytes 2014-12-23 19:45:09

+0

Me.yourTableAdapter.Update(Me.yourDataSet.yourTable) - 我在此有例外行已經,所以不知道上面的答案工作 – phanvugiap 2016-04-23 08:21:57

+0

但是有一個問題在這,如果你綁定一個datagridview到數據集的值將被複制,直到你重新加載表格 – 2016-09-03 19:54:32

1

我一直在追逐這個錯誤在我的應用程序數週!我終於找到了我的問題。

我在應用程序中找到什麼......

我有很多textboxescomboboxes等綁定數據綁定。其中一些字段正在從其他字段的組合中更新。這一切都只有一個例外

的偉大工程,如果計算的領域之一,被後您EndEdit 之前你Update重新計算,這將導致一個dbconcurrency衝突。

此錯誤並不一定意味着該行不再存在;它僅僅意味着它由於某種原因沒有更新行。我的理由是,數據有三種不同的狀態,所以它認爲別人在我稱之爲更新之前更改了數據。

順便說一下,這是位於用戶計算機上的單個MDF,因此在更新期間沒有其他人可以訪問它來更改它。一位用戶,一次更新。我的代碼是「其他」用戶。

希望這可以幫助指向別人正確的方向來申請。

+0

所有的更改後,只需調用dataTable.AcceptChanges() ; – Vectoria 2017-01-11 11:06:18

0

如果我可以增加我的兩美分價值。

我一直在努力。在我們的應用程序中,我們計算了列,其中列是兩個或更多其他列的計算結果。

This Recalc扔適配器。我不得不設置SqlCommandBuilder.ConflictOption = ConflictOption.OveriteChanges來解決這個問題。

我不知道是否有一個選項告訴適配器在檢查時忽略只讀列。

相關問題