わんくまサイトの掲示板みてたら
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の拡張メソッドぽいやつ。