New OleDb.OleDbCommand で入力する文字を変数で定義できますか?

タグの編集
投稿者 他路  (社会人) 投稿日時 2011/4/21 13:52:59
お世話になります。
テーブル(管理番号)にレコードの挿入をしようとしています。
DoLoopで数千件を連続挿入するために、
フィールド(a,b,cの3つ)を変数で定義したところ、
「1つ以上のパラメータが設定されていません」のエラーが発生します。
どのようにすればよいでしょうか?

Com = New OleDb.OleDbCommand("Insert INTO 管理番号 VALUES(a, b, c)", cn)

よろしくお願いいたします。
投稿者 YuO  (社会人) 投稿日時 2011/4/21 14:12:09
普通に文字列操作することになります。
Com = New OleDb.OleDbCommand( _
    "Insert INTO 管理番号 VALUES(""" & a & """, """ & b & """, """ & c & """)", cn)

ただし,これはインジェクションを全く考慮していないため,使うべきではないでしょう。

Com = New OleDb.OleDbCommand("Insert INTO 管理番号 VALUES(?, ?, ?)", cn)
Com.Parameters.Add("@p1", OleDbType.VarChar, 80).Value = a
Com.Parameters.Add("@p2", OleDbType.VarChar, 80).Value = b
Com.Parameters.Add("@p3", OleDbType.VarChar, 80).Value = c
のように,パラメータを使ったクエリを使用すべきです。

MSDN: OleDbParameter クラス (System.Data.OleDb)
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbparameter.aspx
投稿者 他路  (社会人) 投稿日時 2011/4/21 16:07:41
YuOさん、ご丁寧なアドバイスありがとうございます。

>普通に文字列操作することになります。
うまくいきました。

>パラメータを使ったクエリを使用すべきです。
この方法でいきたいのですが、
宣言は、どのようにすべきでしょうか?
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbparameter.aspx
へ、飛んでいったのですが、判りませんでした。

当方、MSAccess より、3日前に VisualStudioExpressをインストールし
悪戦苦闘の日々を送っています。
申し訳けありませんが、よろしくお願いいたします。
また、ここを読めばわかるよ! でも結構です。

投稿者 neptune  (社会人) 投稿日時 2011/4/21 16:55:15
>へ、飛んでいったのですが、判りませんでした
何が判らないのか書かなければ想像しなければなりません。
アドバイスをもらいにくいですよ。

YuO さんがサンプルを書いて下さっていますが、それに付いては調べてみましたか?
投稿者 他路  (社会人) 投稿日時 2011/4/21 17:22:34
neptuneさん、ありがとうございます。
ご指摘の通りですね。すみませんでした。以後、気をつけます。

>Com.Parameters.Add("@p1", OleDbType.VarChar, 80).Value = a
の OleDbType のところで、宣言されていません。のエラーが発生します。
そこで、宣言の方法を理解すべく
http://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbparameter.aspx
へ行き、よくわからないまま、そこにあった宣言のサンプル
Public NotInheritable Class OleDbParameter _
Inherits DbParameter _
Implements ICloneable, IDbDataParameter, IDataParameter
をコピーしたのですが、かえってエラーが増えました。
そこで、エラーが発生した、 OleDbType にカーソルを当てたときに、表示された
Imports System.Data.OleDb を追加したのですが
「出力テーブル’管理番号’が見つかりませんでした」のエラーが発生しています。
なんとなく、Parameters か OleDbType の宣言をすればよいのかな?
と思っているのですが、もう少し、自分で調べてみます。


投稿者 とくま  (社会人) 投稿日時 2011/4/21 17:31:19
> 「出力テーブル’管理番号’が見つかりませんでした」のエラーが発生しています。
データベースに該当するテーブルが無いと言っていますよ?
投稿者 他路  (社会人) 投稿日時 2011/4/22 08:24:06
とくまさん、ありがとうございます。

>データベースに該当するテーブルが無いと言っていますよ? 
でも、間違いなくあるのです。

みなさん、本件、ありがとうございます。
自分で、解決してみたいと思います。
一旦、解決とさせていただきます。

YuOさん、ありがとうございました。