ListPage

2010年9月3日金曜日

OracleDataAdapterとOracleCommand

わんくまサイトの掲示板みてたら

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 件のコメント:

コメントを投稿