我在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失败了,因为还没有真正创建行吗?
答案 0 :(得分:3)
我解决了如下:
修改数据表后执行以下步骤。
dataTable = dataTable.GetChanges()
答案 1 :(得分:-1)
最简单的方法是在设计器中打开数据集。删除更新,插入和删除命令,选择表适配器 - 配置 - 高级选项 - 生成插入,更新和删除语句。不选中第二个选项。