テーブル アダプターを想定どおりに使用していないような気がします。私はここでいくつかの質問を読みました.datagridviewの(DGV)での同時実行エラーの処理に関するこのMSの記事。
私のセットアップでは、一度に 1 人のユーザーのみがテーブルにアクセスし、その人が作業しているローカル HD にアクセスします。タブコントロールの複数のタブで複数の DGV を使用しています。DGV は Access DB のテーブルにバインドされています。ユーザーが 2 つ以上の行にまたがる複数のセルに値を入力しようとすると、2 行目の 2 番目のセルの後で同時実行エラーが発生します。同時実行エラーを一度処理し、主キー列を更新する 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 の新しい行 (名前など) のセルに入力します。彼らが1行だけを埋めると、すべてが正しく更新/挿入され、DBはそれにIDを割り当て、次にアクセスしたときに表示されます。新しい行ごとに複数の列に書き込もうとすると、同時実行エラーがスローされます。新しい行が追加されるたびに、DGV の ID は DBNull になりますが、更新または入力されると、DB によって生成された ID が使用されることに注意してください。DGV が ID 列に正しいキーを表示している場合、同時実行エラーが発生することはありません。