- - PR -
GridViewでテーブル名もパラメータ化したい
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-08-28 17:05
.net初心者です。
現在、既存のDBをブラウザ上で参照するために.net2.0のgridviewにて データを表示しようとしております。 gridviewのSQLステートメントにおいてテーブル名自体を「?」とし、 パラメータの定義画面にて「?」のパラメータ名をTableName、 パラメータソースをControl、ControlIDをテーブル名をデフォルトで 記載してあるラベル、defaultValueにもテーブル名を直接記載していますが、 「クエリのテスト」においてもデバッグ時においても オラクルのエラーで ORA-00903: invalid table name(テーブル存在せず) が帰ってきてしまいます。 何かご存知の方、いらっしゃいましたらご教示のほどお願いします。 | ||||
|
投稿日時: 2007-08-28 23:22
オラクルには詳しくないですがオラクルのパラメータって「?」であってますか?
オラクルではそのようにテーブルを変数で扱えるのですか?そうでないなら .NET側で文字列整形する必要がありますね。 | ||||
|
投稿日時: 2007-08-29 09:23
普通、パラメータドクエリーでテーブル名を変数にはできないと思います。。。
| ||||
|
投稿日時: 2007-08-29 09:46
私も、明確な根拠は見つけられませんでしたが、普通は無理だと認識しています。
パラメータクエリは、パラメータを置換してから、DBMSに渡されるわけではありません。パラメータはホスト変数として渡され、パラメータの実際の値が設定される前に、 クエリが解析され、実行計画が作成されます。 これによりOracleを含む多くのDBMSでは、同じパラメータクエリを パラメータを変えて2回以上発行した場合でも、 実行計画の再利用ができるので、パフォーマンスが向上します。 そういう点から考えても、テーブル名をパラメータにするのは不可能と思えます。 .NET 側で文字列連結してクエリを作成するしかないでしょう。 | ||||
|
投稿日時: 2007-08-29 09:51
べる様
返答ありがとうございます。 WHERE句内の条件は「?」で渡せてますので、その点は 問題ないかと思います。 (.net側で自動生成された「@mojiretu」などの 渡し方は不可能でした。) GridViewタスクにてテーブル名を変数で扱える事ができるのかどうかが 一番知りたいポイントです。 宜しくお願い致します。 | ||||
|
投稿日時: 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); | ||||
|
投稿日時: 2007-08-29 10:33
yawata133さんのレスに補足です。
SQLのパラメータにできないわけですから、 SqlDataSource 等を使わずに 直接バインドしてしまうというのがこの方法です。 おそらく今は SqlDataSource を使われているのではないでしょうか? このように、自前で DataSet や DataTable を用意して、 バインドするコードも手動で記述します。 ■データセットにバインドする場合 GridView1.DataSource = [データセットの変数名] GridView1.DataMember = [データセット内のテーブル名] GridView1.DataBind() ■データテーブルにバインドする場合 GridView1.DataSource = [データテーブルの変数名] GridView1.DataBind() SqlDataSource を使って実現する方法ってあるのでしょうか? 私は思いつきませんので、詳しい方がいましたらお願いします。
ソースを見ていくつか疑問に思いましたので、指摘させて頂きます。 string sqlStr = "SELECT 項目1,項目2,項目3,項目4 FROM" + TableName; →細かいですが、FROMの後に半角スペースか何か必要です。 DataTable tbl = new DataTable(); →ここでnewしたインスタンスは使用されていませんから不要です。 return (tbl); →DataTable を返すメソッド内という前提ですか? しかも返すのは DataSet でなく DataTable? #ところで言語書いてませんけど、C#でよかったんでしょうか? | ||||
|
投稿日時: 2007-08-29 16:00
SqlDataSource1.SelectCommand = "select * from " + TableName; とかすればできますね。ただ、カラム名とか同じじゃないとあまり動的にする恩恵を受けられない気がしますね。 |