OracleDataAdapterとOracleCommand
Bind変数が違う
基本的にrom専でしたがちょっと気になった所がありました。
ODP.NETを使用している方で、多分色々とごっちゃになってました。
>Execute Error:ORA-01008: バインドされていない変数があります。
>上記エラーが発生します。
private void AddOracleParameter (object value1, object value2) { OracleParameter[] param = new OracleParameter[] {new OracleParameter("startDate", OracleDbType.Int32), new OracleParameter("endDate", OracleDbType.Int32)}; param[0].Value = value1; param[1].Value = value2; cmd.BindByName = true; foreach (OracleParameter item in param) { cmd.Parameters.Add(item); } }
これだと、変数cmdって事は多分OracleCommandで
OracleCommandのバインド変数にセットしその後、OracleDataAdapterのコンストラクタに
cmd.CommandTextを突っ込んでますが
これだと、OracleCommandのバインド変数がOracleDataAdapterに渡る事はにゃあですので
実際には、AddOracleParameterメソッドをオーバーロードさせるなりなんなりさせ
AdapaterかCommandかを切り分ける必要があります。
private void AddOracleParameter (object obj, dbtype dtype, int size) { OracleDataAdapter1.SelectCommand.Parameters.Add (obj, dtype, size); } private void AddOracleParameter (object obj, dbtype dtype, int size, hoge hoge) { OracleCommand.Parameters.Add (obj, dtype, size); }
これ実際にプロジェクト中になるとわかりづらいんです。
Execute Error:ORA-01008: バインドされていない変数があります。
変数がバインドされていないので、OracleCommand.ParametersのAddメソッドが
正常な形で行われているのかそれとも’SQL文がおかしい’のか切り分けが微妙になってきます。
いやまぁ、OracleDataAdapterにもバインド変数をセットするプロパティが
あるのを事前に調べとけって話ですがね。
using (OracleDataAdapter oda = new OracleDataAdapter(cmd.CommandText, Cnn)) { using (System.Data.DataSet da = new System.Data.DataSet()) { AddOracleParameter(_start, _end); oda.Fill(da, dataMember); return da; } }
※AddOracleParameterは多分、自作クラスのODPの拡張メソッドぽいやつ。
0 件のコメント:
コメントを投稿