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

时间:2009-08-08 10:40:39

标签: database vb.net concurrency

我在Visual Basic Express Edition(winforms)中设置了一个简单的mdb数据库,我正在尝试将数据从datagridview更新到数据库。我已经将文本框数据化为datagridview中我想要的列,这非常有用。

经过一番挣扎,我终于设法在数据库的每一行都更新了值。但是,尝试修改新创建的记录会引发此错误:“并发冲突:UpdateCommand影响预期的1条记录中的0”

我的意思是,似乎错误只发生在新创建的行上。因为关闭应用程序并立即重新打开它,我可以更新单元格的值。 我还注意到,当我刚创建一个新行时,行的ID设置为“-1”。其他行没有ID的负数。这可能是原因吗?好像该行没有真正更新到数据库。

所以这是AddRow按钮的代码

Dim newRow As MusicDBDataSet.SongsRow
        newRow = MusicDBDataSet.Songs.NewSongsRow()
        newRow.Name = txtBoxNewName.Text
        newRow.Genre = txtBoxNewGenre.Text
        newRow.Rhytm = txtBoxNewRhytm.Text
        newRow.Length = txtBoxNewLength.Text
        MusicDBDataSet.Songs.Rows.Add(newRow)

        Try
            Me.Validate()
            Me.SongsTableAdapter.Update(Me.MusicDBDataSet.Songs)
            Me.SongsBindingSource.EndEdit()
            Me.MusicDBDataSet.Songs.AcceptChanges()

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

这会将我放入文本框的数据填充到DataGridView的新行中。 一切看起来都很好(除了ID列的-1值)

数据绑定到数据库的文本框,这些是我用来尝试更新单元格值的文本框。 代码如下所示:

Try
    Me.Validate()
    Me.SongsBindingSource.EndEdit()
    Me.SongsTableAdapter.Update(Me.MusicDBDataSet.Songs)
    Me.MusicDBDataSet.Songs.AcceptChanges()

Catch ex As Exception
    MsgBox(ex.Message)
End Try

现在,我完全不确定这是否是正确的做法。 但考虑到这一点,用于更新新创建的行的值的文本框是数据绑定到数据库或tableadapter本身吗?可能是UpdateCommand失败了,因为还没有真正创建行吗?

2 个答案:

答案 0 :(得分:3)

我解决了如下:

修改数据表后执行以下步骤。

dataTable = dataTable.GetChanges()

答案 1 :(得分:-1)

最简单的方法是在设计器中打开数据集。删除更新,插入和删除命令,选择表适配器 - 配置 - 高级选项 - 生成插入,更新和删除语句。不选中第二个选项。