まずは、自動生成される更新クエリの内容を確認するため、 cb = New OleDbCommandBuilder(da) の実行直後に、このようなコードを書いて、正しい更新コマンドが得られているかを確認しましょう。
da.UpdateCommand = cb.GetUpdateCommand() Debug.Print($"{da.UpdateCommand.CommandText}") For Each p As OleDbParameter In da.UpdateCommand.Parameters Debug.Print($" [{p.ParameterName}], Col=[{p.SourceColumn}], Ver={p.SourceVersion}, DB型={p.OleDbType}, VB型={p.DbType}, Size={p.Size}") Next
> Dim i As Integer ループカウンタのような局所的な変数を、コードの先頭で事前宣言すべきではありません。
VB.NET 2002 といった古いバージョンならいざ知らず、2003 以降では For i As Integer = 0 To dr.Length - 1 のようにして、For 内でしか使われない、ブロック スコープの変数にすべきです。 (VB2008 以降では、For i As Integer = 0 ではなく For i = 0 と書くのが一般的)