Ich habe ein Problem mit einer DataGridView-basierten Anwendung. Wenn ich nach dem Hinzufügen von Datensätzen zum Grid anschließend versuche, die neuen Datensätze zu aktualisieren oder zu löschen, erhalte ich folgende Fehler. Parallelitätsverletzung: der UpdateCommand betroffen 0 der erwarteten 1 Datensätze. Gleichzeitigkeitsverletzung: der DeleteCommand betroffen 0 der erwarteten 1 Datensätze. Ein Speichern des Datasets wird im RowValidated-Ereignis erzwungen.DataGridView - Concurrency-Problem beim Aktualisieren oder Löschen neuer Datensätze
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
Die Client-Anwendung sitzt oben auf eine relativ einfache 3-Tier-Architektur auf ein 11-Back-End Oracle sprechen, in diesem Fall mit den Elementen 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
Mein Verständnis für die Situation ist, dass ich die Datenquelle im Netz zu aktualisieren, so dass sie die Änderungen widerspiegeln. Um dies zu erreichen, möchte ich das Raster aktualisieren, indem ich den Aktualisierungsvorgang in ein Ereignis in der Datagrid-Ansicht einbinden. Jedoch scheint keines der Ereignisse, die ich versucht habe, zu funktionieren. Mit jedem bisher versuchten Ereignis habe ich Fehler erhalten, dass eine Aktualisierung der Datenquelle innerhalb des Ereignisses nicht erlaubt ist. Bei Betrachtung scheint das logisch. Gibt es ein Ereignis, das mit der Datagridview verknüpft ist, die ich verwenden kann, um eine Aktualisierung der Datenquelle zu erzwingen?
Der DGV ist nur das Mittel, um dem Benutzer eine * Sicht * der * Daten * zu bieten; Es gibt nicht viel in der Art von DB-bezogenen Ereignissen. Die Kombination aus DataAdapter und DataTable ist jedoch sehr leistungsfähig, aber dieser Code scheint diese Funktionen nicht zu nutzen. Die DataTable kann nach dem Aktualisieren aktualisiert werden, um Änderungen zu übernehmen. Ereignisse aus dem DataAdapter können in einigen Situationen hilfreich sein – Plutonix