- PR -

GridViewでテーブル名もパラメータ化したい

投稿者投稿内容
Angler
ベテラン
会議室デビュー日: 2004/12/21
投稿数: 56
投稿日時: 2007-08-28 17:05
.net初心者です。

現在、既存のDBをブラウザ上で参照するために.net2.0のgridviewにて
データを表示しようとしております。

gridviewのSQLステートメントにおいてテーブル名自体を「?」とし、
パラメータの定義画面にて「?」のパラメータ名をTableName、
パラメータソースをControl、ControlIDをテーブル名をデフォルトで
記載してあるラベル、defaultValueにもテーブル名を直接記載していますが、
「クエリのテスト」においてもデバッグ時においても
オラクルのエラーで
ORA-00903: invalid table name(テーブル存在せず)
が帰ってきてしまいます。

何かご存知の方、いらっしゃいましたらご教示のほどお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-08-28 23:22
オラクルには詳しくないですがオラクルのパラメータって「?」であってますか?

オラクルではそのようにテーブルを変数で扱えるのですか?そうでないなら
.NET側で文字列整形する必要がありますね。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2007-08-29 09:23
普通、パラメータドクエリーでテーブル名を変数にはできないと思います。。。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-08-29 09:46
私も、明確な根拠は見つけられませんでしたが、普通は無理だと認識しています。

パラメータクエリは、パラメータを置換してから、DBMSに渡されるわけではありません。パラメータはホスト変数として渡され、パラメータの実際の値が設定される前に、
クエリが解析され、実行計画が作成されます。
これによりOracleを含む多くのDBMSでは、同じパラメータクエリを
パラメータを変えて2回以上発行した場合でも、
実行計画の再利用ができるので、パフォーマンスが向上します。
そういう点から考えても、テーブル名をパラメータにするのは不可能と思えます。
.NET 側で文字列連結してクエリを作成するしかないでしょう。
Angler
ベテラン
会議室デビュー日: 2004/12/21
投稿数: 56
投稿日時: 2007-08-29 09:51
べる様

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

WHERE句内の条件は「?」で渡せてますので、その点は
問題ないかと思います。
(.net側で自動生成された「@mojiretu」などの
渡し方は不可能でした。)

GridViewタスクにてテーブル名を変数で扱える事ができるのかどうかが
一番知りたいポイントです。

宜しくお願い致します。
yawata133
ベテラン
会議室デビュー日: 2007/04/06
投稿数: 76
投稿日時: 2007-08-29 09:52
普通に以下のSQL文を書いて、データテーブルをGridViewにバインドすれば出力できます。

string TableName=テーブル名;

string sqlStr = "SELECT 項目1,項目2,項目3,項目4 FROM" + TableName;

DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sqlStr,connStr);

da.Fill(ds, "table");

DataTable tbl = new DataTable();
tbl = ds.Tables["table"];
return (tbl);
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-08-29 10:33
yawata133さんのレスに補足です。

SQLのパラメータにできないわけですから、
SqlDataSource 等を使わずに
直接バインドしてしまうというのがこの方法です。
おそらく今は SqlDataSource を使われているのではないでしょうか?

このように、自前で DataSet や DataTable を用意して、
バインドするコードも手動で記述します。

■データセットにバインドする場合

GridView1.DataSource = [データセットの変数名]
GridView1.DataMember = [データセット内のテーブル名]
GridView1.DataBind()


■データテーブルにバインドする場合

GridView1.DataSource = [データテーブルの変数名]
GridView1.DataBind()


SqlDataSource を使って実現する方法ってあるのでしょうか?
私は思いつきませんので、詳しい方がいましたらお願いします。

引用:

yawata133さんの書き込み (2007-08-29 09:52) より:
普通に以下のSQL文を書いて、データテーブルをGridViewにバインドすれば出力できます。

string TableName=テーブル名;

string sqlStr = "SELECT 項目1,項目2,項目3,項目4 FROM" + TableName;

DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sqlStr,connStr);

da.Fill(ds, "table");

DataTable tbl = new DataTable();
tbl = ds.Tables["table"];
return (tbl);



ソースを見ていくつか疑問に思いましたので、指摘させて頂きます。

string sqlStr = "SELECT 項目1,項目2,項目3,項目4 FROM" + TableName;
 →細かいですが、FROMの後に半角スペースか何か必要です。

DataTable tbl = new DataTable();
 →ここでnewしたインスタンスは使用されていませんから不要です。

return (tbl);
 →DataTable を返すメソッド内という前提ですか?
  しかも返すのは DataSet でなく DataTable?


#ところで言語書いてませんけど、C#でよかったんでしょうか?
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-08-29 16:00
引用:
SqlDataSource を使って実現する方法ってあるのでしょうか?
私は思いつきませんので、詳しい方がいましたらお願いします。

どっかのタイミングで
SqlDataSource1.SelectCommand = "select * from " + TableName;
とかすればできますね。ただ、カラム名とか同じじゃないとあまり動的にする恩恵を受けられない気がしますね。

スキルアップ/キャリアアップ(JOB@IT)