DOBON.NET DOBON.NETプログラミング掲示板過去ログ

OleDbCommandで同じ名前のパラメータがあるとエラーになってしまう

環境/言語:[VS2005(C#) .NET Framework2.0]
分類:[.NET]

2007/05/08(Tue) 18:34:19 編集(投稿者)

OleDbCommandで同じ名前のパラメータがあるとエラーになってしまう。

OleDbConnection、OleDbCommandを使用して、下記の様に同じパラメータがあるSQLを実行すると
「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」
とエラーが出てしまいます。
(com.ExecuteReader();でエラーになります。)

OleDbCommandでSQL文に同じパラメータは使用出来ないんでしょうか?


string sql = "select * from dual where 'A' = :P_TEST OR 'B' = :P_TEST";
string connectionString = "Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=****;Password=****;Data Source=****;";
using (System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(connectionString))
{
con.Open();
using (System.Data.OleDb.OleDbCommand com = new System.Data.OleDb.OleDbCommand(sql, con))
{
com.Parameters.Add("P_TEST", System.Data.OleDb.OleDbType.VarChar);
com.Parameters["P_TEST"].Value = "A";

com.ExecuteReader();
}
}

以上、よろしくお願いします。
■No19664に返信(羽住さんの記事)

OleDbCommand の話をしているときに DB の種類が明示されていないのは気になりますね。
( Provider=OraOLEDB.Oracle.1 という記述があるので、かろうじて Oracle らしいのはわかりますが)

あと、ConnectionString に ID と Password が丸見えになっていますが、これもあまりよろしくないかと。
開発用サーバのものだと思いますが、公の場である掲示板に載せるときは伏せておくべきでしょうね。

> OleDbCommandで同じ名前のパラメータがあるとエラーになってしまう。
>
> OleDbConnection、OleDbCommandを使用して、下記の様に同じパラメータがあるSQLを実行すると
> 「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」
> とエラーが出てしまいます。
> (com.ExecuteReader();でエラーになります。)
>
> OleDbCommandでSQL文に同じパラメータは使用出来ないんでしょうか?

えーと、どう答えればいいでしょうか。
羽住さんがとられた方法でエラーが出ているわけですから、たぶん使えないんじゃないかな?
ぐらいは推測できますが、そうした場合は違う名前で同じ内容のパラメータを複数用意すれば
すむ話なんじゃないかなー?と思います。
(疑問符 [?] プレースホルダを使えば同じ名前でも使えますが、そういう意味ではないですよね)
> OleDbCommand の話をしているときに DB の種類が明示されていないのは気になりますね。
> ( Provider=OraOLEDB.Oracle.1 という記述があるので、かろうじて Oracle らしいのはわかりますが)

あ、すみません。
DB書いてなかったですね。
ぽぴ王子さんが言うように、Oracle9.2.0.6です。


> あと、ConnectionString に ID と Password が丸見えになっていますが、これもあまりよろしくないかと。
> 開発用サーバのものだと思いますが、公の場である掲示板に載せるときは伏せておくべきでしょうね。

指摘ありがとうございます。
後で直そうと思ったまま、忘れてそのまま書込みしてしまいました。
IDとPasswordは****に変更させてもらいました。


> 羽住さんがとられた方法でエラーが出ているわけですから、たぶん使えないんじゃないかな?
> ぐらいは推測できますが、そうした場合は違う名前で同じ内容のパラメータを複数用意すれば
> すむ話なんじゃないかなー?と思います。

同じ内容なのに、パラメータが増えていくのが嫌だな〜と思ったんで。。。

> (疑問符 [?] プレースホルダを使えば同じ名前でも使えますが、そういう意味ではないですよね)
そういう意味じゃないですね。。。
■No19666に返信(羽住さんの記事)

>>羽住さんがとられた方法でエラーが出ているわけですから、たぶん使えないんじゃないかな?
>>ぐらいは推測できますが、そうした場合は違う名前で同じ内容のパラメータを複数用意すれば
>>すむ話なんじゃないかなー?と思います。
>
> 同じ内容なのに、パラメータが増えていくのが嫌だな〜と思ったんで。。。
>
>>(疑問符 [?] プレースホルダを使えば同じ名前でも使えますが、そういう意味ではないですよね)
> そういう意味じゃないですね。。。

「同じ内容なのに」というのは羽住さん(というか人間側)の都合ですよね。
OleDbCommand からしてみれば、CommandText 内でプレースホルダがあらわれたら、それぞれに
パラメータを1対1で対応させているのだと思います。
OleDbCommand.Parameters プロパティは OleDbParameterCollection クラスですから、コレクション
ということで同じ名前は許されないということなのでしょう。
疑問符プレースホルダの場合は、内部で一時的な名称をつけて管理しているようです。

ということで、同じ内容でもプレースホルダの数だけパラメータを定義しなくてはいけないし、同じ名前
のパラメータは作成できない、ということですね。
OleDbCommandの場合、パラメータコレクションの方には任意の名前のパラメータを定義できますが、
コマンドテキストには順番に展開されるプレースホルダとして動作するパラメータマーカ「?」しか
記述できなかったかと思うのですが。(私の勘違い?)
コマンドテキストで
「:名」を使えるのはOracleCommand、
「@名」を使えるのはSqlCommand、
だったかと。

そして、パラメータマーカ「?」を使う場合、
パラメータコレクション側の名前は任意につけられますが
コマンドテキストとの関係上名前に意味がなくなるためパラメータコレクションの数は
コマンドテキスト上の「?」の数と一致する必要があります。

DOBON.NET | プログラミング道 | プログラミング掲示板