2017-09-18 90 views
0

我有一個基於DataGridView的應用程序出現問題。將記錄添加到網格後,如果我隨後嘗試更新或刪除新記錄,則會收到以下相應錯誤。 併發衝突:UpdateCommand影響了預期的1條記錄中的0個。 併發衝突:DeleteCommand影響了預期的1條記錄中的0個。 在RowValidated事件中強制保存數據集。DataGridView - 更新或刪除新記錄時的併發問題

Private Sub uxGrid_RowValidated(sender As Object, e As DataGridViewCellEventArgs) Handles uxGrid.RowValidated 
    If IsDGVRowDirty(sender, e.RowIndex) Then 
     Save() 
    End If 
End Sub 

Private Sub Save() 
    Const procName As String = "Save" 
    Try 
     _Logger.SendLog(Me.Name & "." & procName & " - Saving alarm definition data.", NLog.LogLevel.Trace) 
     _myAlarmDefinitionMngr.Save(_myDataSet) 
     _Logger.SendLog(Me.Name & "." & procName & " - Alarm definition data has been saved.", NLog.LogLevel.Trace) 
    Catch ex As Exception 
     MsgBox("There was a problem whilst saving your changes. Please reload the form and try again. " & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Critical) 
     _Logger.SendLog(ex.Message & ". Thrown in module " & Me.Name.ToString & "." & procName, NLog.LogLevel.Error, ex) 
    Finally 
    End Try 
End Sub 

的客戶端應用程序坐落在一個相對簡單的三層建築設計交談到Oracle 11的後端的上方,在這種情況下,包括的元素AlarmDefinitionManager.vb,AlarmDefinitionDB.vb,AlarmDefinition.vb。

Public Function Save(ByVal myDataSet As DataSet) As Integer 
    Dim myOda As OracleDataAdapter 
    Dim myConnection As New OracleConnection 
    Dim myCommand As OracleCommand = Nothing 
    Dim myDataAdapter As OracleDataAdapter 
    Dim myBuilder As OracleCommandBuilder 
    Dim sqlStatement As String 

    myConnection = New OracleConnection 
    myConnection.ConnectionString = _connectStr 
    sqlStatement = "SELECT ID, LEGENDID, STATUSID, STATUSTYPEID, DIGITALSET FROM P_TBL_ALARMDEF" 
    If myDataSet.HasChanges Then 
     Try 
      myOda = New OracleDataAdapter(sqlStatement, myConnection) 
      myBuilder = New OracleCommandBuilder(myOda) 
      myOda.SelectCommand = New OracleCommand(sqlStatement, myConnection) 
      myOda.Update(myDataSet, "AlarmDefinition") 
      myDataSet.AcceptChanges() 
      myConnection.Close() 
     Catch ex As Exception 
      Throw 
     Finally 
      myCommand = Nothing 
      myDataAdapter = Nothing 
      myBuilder = Nothing 
      CType(myConnection, IDisposable).Dispose() 
     End Try 
    End If 
End Function 

我瞭解的情況是,我需要刷新數據源的網格,這樣,它反映所做的更改。爲了實現這一點,我希望通過將刷新過程掛接到datagridview中的事件來刷新網格。然而,我所嘗試的事件似乎都沒有奏效。對於到目前爲止嘗試過的每個事件,我都收到了錯誤,表示在事件中不允許刷新數據源。反思這似乎是合乎邏輯的。有沒有與datagridview關聯的事件,我可以使用它來強制刷新數據源?

+0

DGV只是向用戶提供* data *的* view *的手段;數據庫相關事件的方式並不多。但是,DataAdapter和DataTable組合功能非常強大,但該代碼看起來並沒有充分利用這些功能。 DataTable可以在更新後刷新以獲取更改。來自DataAdapter的事件在某些情況下可能會有用 – Plutonix

回答

1

您不應該在驗證行時嘗試保存數據集。 對數據集進行更改,然後將數據源設置爲空,並重新將數據源重新附加到網格以強制刷新。

我個人不喜歡對數據網格進行更改。我更喜歡編輯datagrid外部的行並將UPDATE cmd發送到SQL,然後刷新我的網格。我更好地控制對網格所做的更改。

+0

Spot on。第一段是真的,第二段是非常好的建議。保羅應該遵循它。 –

0

排序我的問題。每行更改都直接保存到RowValidated事件中的數據庫中。