ODP.NETのOracleCommandでバインド変数使用時に注意すべきこと

2019年1月29日C#,IT

ODP.NETのOracleCommandでバインド変数を使用する際、
エラーが発生して大変困りました。
原因の調査に時間がかかったので備忘録として残しておきます。

エラーの原因

ODP.NETのOracleCommandでバインド変数を使用する際、
デフォルトではOracleCommand.BindByName = falseになっています。
これがfalseになっていると、名前解決してくれません。
上記設定のせいでエラーが出ていました。
OracleCommand.BindByName = true にすれば名前解決してくれます。

OracleCommand.BindByName = falseの挙動

SELECT * FROM HOGETABLE WHERE HOGE_ID = :hoge1 AND HOGE2_ID = :hoge2

上記のようなSQLにバインドするために

oracleCommand.Parameters.Add(new OracleParameter(":hoge2", "ほげ2"));
oracleCommand.Parameters.Add(new OracleParameter(":hoge1", "ほげ1"));

と書いて実行するとエラーが発生します。
OracleCommand.BindByName = falseの時、
バインドを順序で解決するからです。
順序で解決する場合に同じパラメータを繰り返し使う時、
その都度Parameters.Addする必要があるため非常に面倒です。
OracleCommand.BindByName = true を使うようにしましょう。

まとめ

なぜデフォルトがOracleCommand.BindByName = falseなんだろうか……。

同じ問題に苦しんだ人達の解説

http://odashinsuke.hatenablog.com/entry/20120617/1339907156
デフォルト設定が引き起こす問題はなかなか気付きにくいと思います……。

2019年1月29日C#,IT

Posted by raishin