【问题标题】:DataGridView - Concurrency Issue When Updating or Deleting New RecordsDataGridView - 更新或删除新记录时的并发问题
【发布时间】:2017-09-18 14:06:26
【问题描述】:

我对基于 DataGridView 的应用程序有疑问。将记录添加到网格后,如果我随后尝试更新或删除新记录,则会收到以下相应错误。 并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条。 并发冲突:DeleteCommand 影响了预期的 1 条记录中的 0 条。 在 RowValidated 事件中强制保存数据集。

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 后端通信的相对简单的 3 层架构设计之上,在本例中包括元素 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 关联的事件?

【问题讨论】:

  • DGV 只是向用户提供数据视图的手段; DB 相关事件的方式并不多。但是,DataAdapter 和 DataTable 组合非常强大,但该代码似乎没有利用这些功能。更新后可以刷新 DataTable 以获取更改。来自 DataAdapter 的事件在某些情况下很有用

标签: vb.net winforms datagridview


【解决方案1】:

您不应在验证行时尝试保存数据集。 对数据集进行更改,然后将数据源设置为 null 并将数据源重新附加到网格以强制刷新。

我个人不喜欢对数据网格进行更改。我更喜欢编辑数据网格之外的行并将 UPDATE cmd 发送到 SQL,然后刷新我的网格。我可以更好地控制对网格所做的更改。

【讨论】:

  • 正确。第一段是真实的,第二段是一个很好的建议。保罗应该遵循它。
【解决方案2】:

解决了我的问题。每个行更改都会在 RowValidated 事件中直接保存到数据库中。

【讨论】:

    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多