C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: odp.net パラメータ続き


(過去ログ 89 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■52857 / inTopicNo.1)  odp.net パラメータ続き
  
□投稿者/ tetu1217 (11回)-(2010/08/26(Thu) 10:01:28)

分類:[.NET 全般] 

なんどもすいません。
情けなくて死にそうですが、教えてください。

http://bbs.wankuma.com/index.cgi?mode=one&namber=52780&type=0&space=0

Execute Error:ORA-01008: バインドされていない変数があります。
上記エラーが発生します。

///Main Class
StringBuilder query = new StringBuilder();
query.Append("select c1,c2,c3,c4 from t1 a ");
query.Append("where exists ( ");
query.Append("select c1,c2, from t2 b ");
query.Append("where a.c4 between :startDate and :endDate and a.c1 = b.c1 )");

odp.AddOracleParameter("startDate", DataAccess.TypeInt32, _start);
odp.AddOracleParameter("endDate", DataAccess.TypeInt32, _end);

このようなクエリとパラメータを設定します。

///DataAccess Class
public void AddOracleParameter
    (string ParameterName, OracleDbType dbtype, object value)
{
    if(cmd.BindByName == false)
    {
        cmd.BindByName = true;
    }
    OracleParameter param = new OracleParameter(ParameterName, dbtype);
    param.Value = value;
    cmd.Parameters.Add(param);
}

OracleDataAdapterからデータセットにFillした時
バインドがされていない〜 というエラーが発生します。
どのようにしたらこのエラーが発生しなくなり正しい結果でデータセットを得られますか?


引用返信 編集キー/
■52858 / inTopicNo.2)  Re[1]: odp.net パラメータ続き
□投稿者/ マサヤ (117回)-(2010/08/26(Thu) 10:41:15)
SqlParameterの話ですが、
// パラメータの定義
SqlParameter[] prm = new SqlParameter[]{
new SqlParameter("startDate",SqlDbType.Int),
new SqlParameter("endDate",SqlDbType.Int)
}
// パラメータに値投入
prm[0].Value = _start;
prm[1].Value = _end;
// コマンド
SqlCommand cmd = new SqlCommand;
// コマンドのコネクションやコマンドテキスト、コマンドタイプを設定
cmd.CommandText = "SELECT * FROM HOGEMASTER";
cmd.Connection = トランザクションとか;
cmd.CommandType = CommandType.Text;
// コマンドにパラメータ付与
foreach(SqlParameter parm in prm)
{
cmd.Parameters.Add(parm);
}
// 実行
SqlDateReader leader = cmd.ExecuteReader();
// クリア
cmd.Parameter.Clear();

いま、環境にOracleがないのですみません。
SqlのとこをOracleに変えたらうまくいかないでしょうか?
引用返信 編集キー/
■52869 / inTopicNo.3)  Re[2]: odp.net パラメータ続き
□投稿者/ tetu1217 (12回)-(2010/08/26(Thu) 11:26:04)
2010/08/26(Thu) 11:28:04 編集(投稿者)
2010/08/26(Thu) 11:27:26 編集(投稿者)
2010/08/26(Thu) 11:27:13 編集(投稿者)

<pre>
■No52858 (マサヤ さん) に返信
> SqlParameterの話ですが、

> いま、環境にOracleがないのですみません。
> SqlのとこをOracleに変えたらうまくいかないでしょうか?

返信ありがとうございます。

///dataaccess class

メソッドを行うとこ以外はクラス内部で完結させてみましたが、駄目でした。

public System.Data.DataSet ReturnDataSet
            (string query, string dataMember, int _start, int _end)
{
    cmd.CommandText = query;
    cmd.CommandType = System.Data.CommandType.Text;
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;
    }
}
}

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.Parametersには登録されているのですが、Fillメソッドを行うとやはり
バインドされていない〜がでてしまいます。

実際のsqlを流す時に、実数を入力すると正常に結果セットが得られるのですが
名前付きパラメータのバインドがやはり上手くいかないようなのです。
対応するパラメータはSQL文のサブクエリ内の :startDate param[0]
:endDate param[1] で param[]内のparameternameはstartDate及びendDateになっている事は
ブレークポイントを設置し確認済みです。
</pre>

引用返信 編集キー/
■52870 / inTopicNo.4)  Re[3]: odp.net パラメータ続き
□投稿者/ マサヤ (122回)-(2010/08/26(Thu) 11:58:55)
2010/08/26(Thu) 12:00:15 編集(投稿者)

クエリ文作成にて:startDate を@startDate, :endDate を@endDateにしたらどうでしょう?
引用返信 編集キー/
■52876 / inTopicNo.5)  Re[4]: odp.net パラメータ続き
□投稿者/ tetu1217 (14回)-(2010/08/26(Thu) 13:18:13)
No52870 (マサヤ さん) に返信
> クエリ文作成にて:startDate を@startDate, :endDate を@endDateにしたらどうでしょう?

http://www.oracle.com/technology/global/jp/oramag/oracle/05-sep/o55odpnet.html
一応、odp.net環境下におけるバインド変数は :変数名だと思ったのですが
変更になったのでしょうか?

@startDate and @endDate に変更してみました。が以下エラーが発生します。
ORA-00936: 式がありません。

この際、実際の値をバインドせずに値を直で同じクエリを流したところ
正常な結果セットが得られます。



引用返信 編集キー/
■52877 / inTopicNo.6)  Re[5]: odp.net パラメータ続き
□投稿者/ マサヤ (124回)-(2010/08/26(Thu) 13:25:45)
すみません。Oracleなんですよね。
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;
}
}
ですが、ExecuteReaderにてOracleDataReaderでとれないでしょうか?
OracleDataAdapterを使用してFillするというやりかたはおいておいてです。
引用返信 編集キー/
■52878 / inTopicNo.7)  Re[3]: odp.net パラメータ続き
□投稿者/ よねKEN (587回)-(2010/08/26(Thu) 13:36:52)
よねKEN さんの Web サイト
2010/08/26(Thu) 13:38:38 編集(投稿者)

ODP.netのことはまったく知りませんのではずしているかもしれませんが、
気になる点はありますのでコメントします。

No52869 (tetu1217 さん) に返信
> public System.Data.DataSet ReturnDataSet
> (string query, string dataMember, int _start, int _end)
> {
> cmd.CommandText = query;
> cmd.CommandType = System.Data.CommandType.Text;
> using (OracleDataAdapter oda = new OracleDataAdapter(cmd.CommandText, Cnn))

ここ↑を【1】と呼ぶことにします。

> {
> using (System.Data.DataSet da = new System.Data.DataSet())
> {
> AddOracleParameter(_start, _end);

ここ↑を【2】と呼ぶことにします。

> oda.Fill(da, dataMember);
> return da;
> }
> }

【1】より前に【2】を実行していません。
OracleDataAdapterオブジェクトがコンストラクタ実行時に渡されているのは、
cmd.CommandTextが返す文字列ですから、パラメータが未解決のSQLのはずです。

odaはcmdのことを知らないので、いくらcmdに対してパラメータを追加してもダメだと思います。
引用返信 編集キー/
■52897 / inTopicNo.8)  Re[1]: odp.net パラメータ続き
□投稿者/ はつね (1317回)-(2010/08/27(Fri) 08:35:07)
2010/08/27(Fri) 08:57:43 編集(投稿者)
No52857 (tetu1217 さん) に返信

なんかむずかしい使い方しているような気がします。
            using (OracleConnection cn = new OracleConnection())
            {
                cn.ConnectionString="hogehoge";
                cn.Open();
                using (OracleCommand cmd = new OracleCommand())
                {
                    cmd.Connection = cn;
                    cmd.BindByName= true;
                    cmd.CommandText="SELECT * FROM hogehoge WHERE C1 BETWEEN :startdate AND :endDate";
                    cmd.Parameters.Add(new OracleParameter("startDate", 
                        OracleDbType.Int32,
                        value1,
                        ParameterDirection.Input));
                    cmd.Parameters.Add(new OracleParameter("startDate",
                        OracleDbType.Int32,
                        value2,
                        ParameterDirection.Input));
                    //ここになんか書くDataAdapterとか
                }
                cn.Close();
            }

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -