无法修复并发冲突VB / Access数据库

时间:2015-10-23 11:53:33

标签: vb.net

无法弄清楚如何解决此问题。如果我向数据库添加行并关闭表单,然后打开表单删除行,我没有问题。仅当我在不关闭表单的情况下添加行和删除行时才会出现此问题。当表单关闭时会发生什么?当表单打开时不会发生?

如果选中某个框,则会将其添加到数据库中。如果取消选中某个框,则会将其删除。

并发冲突:DeleteCommand影响了预期的1条记录中的0条。

无法通过该行访问已删除的行信息。

Private Sub CreateNewDataRow(intNewTreeView As Integer, intNewUserID As Integer)

        Dim tvGeneric As Windows.Forms.TreeView
        Dim intTopic As Integer

        tvGeneric = GetTreeView(intNewTreeView)
        intTopic = intNewTreeView

        Try
            ' Loop through tabs to get checked items
            For x As Integer = 0 To tvGeneric.Nodes.Count - 1
                If tvGeneric.Nodes(x).Checked = True Then
                    Dim drNewRow As MasterDBDataSet.DBAssignedRow
                    drNewRow = MasterDBDataSet.DBAssigned.NewDBAssignedRow

                    With drNewRow
                        .AssignedUser = intNewUserID
                        .AssignedTask = tvGeneric.Nodes(x).Tag
                        .AssignedTopic = intTopic
                        .AssignedCompleted = 0
                        .AssignedWorkCenter = m_intWorkCenter
                        .MergeID = Merge.RandomNumber()
                    End With

                    For Each Task As DataRow In MasterDBDataSet.DBTasks
                        If Task.Item("TaskTopic") = intTopic Then
                            If Task.Item("MergeID") = drNewRow.AssignedTask Then
                                Try
                                    drNewRow.AssignedHours = CInt(Task.Item("TimePerTask"))
                                Catch ex As Exception

                                End Try
                            End If
                        End If
                    Next

                    If CheckExistingAssignments(intNewUserID, drNewRow.AssignedTopic, drNewRow.AssignedTask) Then
                        MasterDBDataSet.DBAssigned.Rows.Add(drNewRow)
                    End If
                    DbAssignedTableAdapter.Update(MasterDBDataSet.DBAssigned)
                Else
                    ' If check box unchecked, remove from database
                    For Each OldAssigned As DataRow In MasterDBDataSet.DBAssigned
                        If OldAssigned.Item("AssignedTask") = tvGeneric.Nodes(x).Tag And OldAssigned.Item("AssignedUser") = intNewUserID Then
                            Try
                                OldAssigned.Delete()
                            Catch ex As Exception

                            End Try
                            Exit For
                        End If
                    Next
                    DbAssignedTableAdapter.Update(MasterDBDataSet.DBAssigned)
                End If
            Next

            DbAssignedTableAdapter.Update(MasterDBDataSet.DBAssigned)
        Catch ex As Exception
            Logger.WriteLog("ERROR : " & ex.Message)
        End Try

    End Sub

1 个答案:

答案 0 :(得分:0)

通过一些阅读,我能够得到一些想法。没有答案,只是想法,我尝试在TableAdapter.Update(Dataset.Table)之后添加TableAdapter.Fill(Dataset.Table),所有似乎都在工作。

就像我说这只是一个似乎对我有用的想法,不确定这是否是正确的方法。会喜欢这方面的一些意见。

这是我目前正在使用的代码。

Private Sub CreateNewDataRow(intNewTreeView As Integer, intNewUserID As Integer)

        Dim tvGeneric As Windows.Forms.TreeView
        Dim intTopic As Integer

        tvGeneric = GetTreeView(intNewTreeView)
        intTopic = intNewTreeView

        Try
            ' Loop through tabs to get checked items
            For x As Integer = 0 To tvGeneric.Nodes.Count - 1
                If tvGeneric.Nodes(x).Checked = True Then
                    Dim drNewRow As MasterDBDataSet.DBAssignedRow
                    drNewRow = MasterDBDataSet.DBAssigned.NewDBAssignedRow

                    With drNewRow
                        .AssignedUser = intNewUserID
                        .AssignedTask = tvGeneric.Nodes(x).Tag
                        .AssignedTopic = intTopic
                        .AssignedCompleted = 0
                        .AssignedWorkCenter = m_intWorkCenter
                        .MergeID = Merge.RandomNumber()
                    End With

                    For Each Task As DataRow In MasterDBDataSet.DBTasks
                        If Task.Item("TaskTopic") = intTopic Then
                            If Task.Item("MergeID") = drNewRow.AssignedTask Then
                                Try
                                    drNewRow.AssignedHours = CInt(Task.Item("TimePerTask"))
                                Catch ex As Exception

                                End Try
                            End If
                        End If
                    Next

                    If CheckExistingAssignments(intNewUserID, drNewRow.AssignedTopic, drNewRow.AssignedTask) Then
                        MasterDBDataSet.DBAssigned.Rows.Add(drNewRow)
                    End If
                    DbAssignedTableAdapter.Update(MasterDBDataSet.DBAssigned)
                    DbAssignedTableAdapter.Fill(MasterDBDataSet.DBAssigned)
                Else
                    For Each OldAssigned As DataRow In MasterDBDataSet.DBAssigned
                        If OldAssigned.Item("AssignedTask") = tvGeneric.Nodes(x).Tag And OldAssigned.Item("AssignedUser") = intNewUserID Then
                            Try
                                OldAssigned.Delete()
                            Catch ex As Exception

                            End Try
                            Exit For
                        End If
                    Next
                    DbAssignedTableAdapter.Update(MasterDBDataSet.DBAssigned)
                    DbAssignedTableAdapter.Fill(MasterDBDataSet.DBAssigned)
                End If
            Next
            DbAssignedTableAdapter.Update(MasterDBDataSet.DBAssigned)
        Catch ex As Exception
            Logger.WriteLog("ERROR : " & ex.Message)
        End Try

    End Sub