2017-09-18 4 views
0

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?

+0

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

Antwort

1

Sie sollten nicht versuchen, Ihr Dataset während der Überprüfung der Zeile zu speichern. Nehmen Sie die Änderungen an Ihrem Dataset vor, setzen Sie Ihre Datenquelle auf null und fügen Sie Ihre Datenquelle wieder an das Grid an, um eine Aktualisierung zu erzwingen.

Ich persönlich mag es nicht, Änderungen an dem Datagrid vorzunehmen. Ich bevorzuge es, die Zeile außerhalb des Datagrids zu bearbeiten und ein UPDATE-Cmd an SQL zu senden, dann mein Gitter zu aktualisieren. Ich habe mehr Kontrolle über die Änderungen am Netz.

+0

Spot on. Der erste Absatz ist richtig und der zweite ist ein sehr guter Ratschlag. Paul sollte ihm folgen. –

0

Sorted mein Problem. Jede Zeilenänderung wird innerhalb des RowValidated-Ereignisses direkt in der Datenbank gespeichert.

Verwandte Themen