OracleCommandのBindByName

Posted by joeartsea on 2009-01-28

Oracle10g,ODP.NETでASP.NET開発の時の話です。ODP.NETのOracleCommandを使ってSQLを書いていますが、書いたUPDATE文がデバッグでは通るのに結果がDBに反映されない不具合に小一時間ハマりました。SQLを部分的にコメントアウトして問題の切り分けなどしても解決しませんでした。

試しにOracleCommandのParameterを使わずに直に値を渡すと普通にうまく行きました。Parameterに何かあるな。Oracleのバグかな。とか思ってましたが、ネット上で見つけたOracleCommandのBindByNameプロパティをTrueにする方法を試してみて原因がわかりました。

結局SQLの列に書いた列名とParameterの名前が違っていた凡ミスだったのですが、それを気付かせるのを遅らせ思考を考え過ぎの深みへと追いやったものはBindByName=Falseです。結局このプロパティはSQLの列名にあってParameterに無い項目があればエラーを吐かせるか否かというものです。OracleCommandのオブジェクトを生成するコンストラクタで必ずBindByNameプロパティをTrueさせてエラーを吐かせましょう。じゃないと何が原因か分からず深みにハマります。

でもコレなんでデフォルトでTrueじゃないんだろう?