> Dim i As Integerの行を削除しました。 > For i =0 > の記述はありますが、 > これでもうまくいくのですね。
VB.NET 2002 までは Dim i As Integer For i = 0 To 10 のように、事前に変数宣言が必須でした。
VB.NET 2003 からは For i As Integer = 0 To 10 のように書くことで、For ブロックのみで有効な「局所変数」を作れるように進化しました。 https://atmarkit.itmedia.co.jp/fdotnet/special/vs2003/vs2003_04.html
その後、VB2008 の時代になって「型推論」という機構が生まれ、 Dim i As Integer = 123 Dim s As String = "abc" といった、変数宣言時に初期値を指定しているコードでは、As 句を省略して Dim i = 123 Dim s = "abc" と書いても良いことになりました。この機能があるおかげで、今では For i = 0 To 10 と書いただけで、(事前に Dim i As Integer 無しで)局所変数 i として認識されるようになっています。
そもそも Imports ステートメントというのは、 'Dim adp As New Global.System.Data.OleDb.OleDbDataAdapter() Dim adp As New System.Data.OleDb.OleDbDataAdapter() 'Global.System.Windows.Forms.MessageBox.Show("TEST") System.Windows.Forms.MessageBox.Show("TEST") といった、名前空間付きの長い型指定を簡略化して、 Dim cn As New OleDbConnection() MessageBox.Show("TEST") のように、名前空間を省略してクラス名だけで短く表記するための仕組みに過ぎません。参照設定とは別物です。
まずは、自動生成される更新クエリの内容を確認するため、 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 と書くのが一般的)
------------------------------------- Private Sub TEST() Using cn As New OleDb.OleDbConnection(接続文字列)
Dim da As OleDb.OleDbDataAdapter Dim ds As DataSet Dim dt As DataTable Dim dr() As DataRow Dim i As Integer Dim cmd As OleDbCommand
Dim strSelect As String Dim strUpdate As String
strSelect = "select * from [テーブルA]" da = New OleDbDataAdapter(strSelect, cn) ds = New DataSet da.Fill(ds, "テーブルA") dt = ds.Tables("テーブルA") dr = dt.Select
For i = 0 To dr.Length - 1 strUpdate = "update [テーブルA]" & " set [フィールドP]=[値] where [ID]=" & dr(i)("ID") & "" cmd = New OleDbCommand cmd.Connection = cn cmd.CommandText = strUpdate cmd.ExecuteNonQuery() Next
------------------------------------- Private Sub TEST() Using cn As New OleDb.OleDbConnection(接続文字列)
Dim da As OleDb.OleDbDataAdapter Dim ds As DataSet Dim dt As DataTable Dim dr() As DataRow Dim cb As OleDbCommandBuilder Dim i As Integer Dim strSelect As String
strSelect = "select * from [テーブルA]"
da = New OleDbDataAdapter(strSelect, cn) ds = New DataSet da.Fill(ds, "テーブルA") dt = ds.Tables("テーブルA") dr = dt.Select
cb = New OleDbCommandBuilder(da)
For i = 0 To dr.Length - 1 dr(i).BeginEdit() dr(i)("フィールドP") = [値] dr(i).EndEdit() Next