我感觉我没有按照我应该的方式使用表适配器。我在这里阅读了几个问题和这篇关于处理 datagridview (DGV) 中的并发错误的 MS 文章。
在我的设置中,我一次只有一个用户访问该表,并且它将位于该人工作的本地 HD 上。我在选项卡控件的多个选项卡上使用多个 DGV。DGV 绑定到 Access DB 中的表。当用户尝试在两行或多行的多个单元格上输入值时,他们将在第二行的第二个单元格之后遇到并发错误。处理并发错误一次,并重新填充更新主键列的 DGV 后,它们不会有任何错误。
回到 DGV 中的现有值也不会导致错误,它似乎只在键列(用户不输入但可以排序)时发生Is DBNull
。
这是我到目前为止所得到的:
Dim m_DtChemical As New DataTable
Dim ChemicalAdapter As OleDbDataAdapter
Dim m_Bsource As New BindingSource
Sub FillChemicalDataGrid()
ChemicalAdapter = New OleDbDataAdapter("Select * From Chemicals", ConMain)
m_DtChemical.Clear()
ChemicalAdapter.Fill(m_DtChemical)
m_Bsource.DataSource = m_DtChemical
ChemicalDataGridView.DataSource = m_Bsource
End Sub
Sub UpdateChemicalsDatabase()
Try
Dim ObjComander As New OleDbCommandBuilder(ChemicalAdapter)
ChemicalAdapter.Update(m_DtChemical)
Catch ex2 As DBConcurrencyException
OhGodImStuckErrorHandler()
MsgBox("Concurrency Error. Reloading Table.")
FillChemicalDataGrid()
Catch ex As Exception
MsgBox("There was an error updating to the database. " & ex.Message)
WriteToErrorLog(ex.Message, ex.StackTrace, ex.GetHashCode, ex.Source, ex.ToString)
End Try
End Sub
Private Sub ChemicalDataGridView_RowValidated(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DataGridViewCellEventArgs) Handles ChemicalDataGridView.RowValidated 'tried CellLeave, CellEnter, CellValidated...etc
Call UpdateChemicalsDatabase()
End Sub
我试图导致合并和更新发生,尤其是If IsDBNull(DGV(0, Xrow).Value) = true
我正在努力做的事情吗?它似乎仅来自 ID(主键列)实际上是 DBNull 的实例。我应该有更好的方法来处理这个问题吗?与其处理并发错误,我觉得我应该能够首先避免它,如果我能弄清楚如何。
我在 VB.net 和 C# 中有类似的项目,都有完全相同的问题。我在 VB.Net 中稍微舒服一些,但我很乐意用以太回答。
编辑:根据评论描述场景:
因此,用户会进来并在 DGV 中的新行上填写一个单元格(例如名称)。如果他们只填写一行,那么所有内容都会正确更新/插入,数据库会为其分配一个 ID,并在下次访问时显示备份。如果他们尝试在每个新行中写入多于一列,则会引发并发错误。我注意到,当他们添加每个新行时,DGV 的 ID 为 DBNull,但是当它被刷新或填充时,它将使用 DB 生成的 ID。当 DGV 在 ID 列中显示正确的键时,它永远不会遇到并发错误。