最初これに気が付かず、何故エラーするのか大いに迷ったことがある。
(Dim cmd As New OleDbCommand)
For i = 0 To 2
With Item(i)
cmd.CommandText = "insert into hoge_tb values(?,?,?)"
cmd.Parameters.Clear() 'これが無いとItem(0)の内容が3回登録されてしまう。
cmd.Parameters.Add("id", OleDbType.Integer).Value = .id
cmd.Parameters.Add("no", OleDbType.SmallInt).Value = i
cmd.Parameters.Add("namae", OleDbType.VarWChar).Value = .Name
cmd.ExecuteNonQuery()
End With
Next i


ループの中では
cmd.Parameters(0).Value = .id
で値を設定します
それとAddした返り値オブジェクトに直接Valueを設定する書き方はどうかと思います。値を一緒に設定するなら別のAddを使うべきです。
文のパラメータより多い数のパラメータがあってもエラーが出なかったり同じパラメータ名を複数設定できてしまう仕様は微妙だと思いますが。
Parameters.Add(xxx).value = yyyy はヘルプにもある使い方で、これが問題だという理由が判りません。
私がこれを問題だと思うのはコレクションへの
追加とその追加したアイテムへの操作を同時に
行っているからです。
2つのレベルの違うオブジェクトにつながり
のない別の操作をしているのが問題だと感じます。
Parameters.Add(xxx).value = yyyy
と書くなら
しかるべきアイテムを作成してから追加
Parameters.Add(New Parameter(xxx, yyyy
))
または
ただ追加した後、値を設定する
Parameters.Add(xxx, type)
Parameters(xxx).Value = yyyy
とでもすべきではということです。
ms-help://MS.VSCC.v80/MS.MSDN.v80/
MS.NETDEVFX.v20.ja/cpref4/html/
T_System_Data_OleDb_OleDbParameter.htm
ここに、
adapter.SelectCommand.Parameters.Add( _
"@CategoryName", OleDbType.VarChar, 80).Value = "toasters"
adapter.SelectCommand.Parameters.Add( _
"@SerialNum", OleDbType.Integer).Value = 239
という記述があります。
でもたとえマイクロソフトのサンプルでも私はこのような書き方を薦めません。
前発言のような書き方を薦めます。
こういう書き方は一般的に許されるべきだと思いますよ。
Addメソッドの戻り値がなぜこの型なのか?を考えると、まさにこういった使い方を想定しているからだと思いませんか?
VB系ではこういう書き方はあまりなじみが無いのかもしれませんが、他の言語では過去から良く使われる手法だと思います。
Addメソッドは文字通りパラメータを"追加"するわけですから、ループの中で使用するのはダメです。
例えば10万件のデータをInsertする用途で上記のコードを使用したらOut of Memoryになりますよ。
Parameters.Clear() してますから。