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

C#, IT

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


エラーの原因

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


OracleCommand.BindByName = falseの挙動

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

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


まとめ

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


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


デフォルト設定が引き起こす問題はなかなか気付きにくいと思います……。

C#, IT

Posted by raishin