none
動的な表データの抽出 RRS feed

  • 質問

  • 開発初心者です。
    VS2010 VB WEBサイトの開発で、オラクルのデータを抽出し、Gridviewでそのデータを
    表示させたいのですが、表示自体はできるのですが、動的SQLの発行ができません。
    行おうとしていることは、
    ソリューションエクスプローラー、App_Code内に、Dataset2.xsdがあり、そこに「TEST_A」テーブルがあり、
    TEST_ATableAdapterにFill,GetData()とあり、その中に、
    「SELECT CODE,NAME,KAZU FROM TEST_A WHERE (NAME = 'a') ORDER BY CODE」
    と書いてます。

    TEST_Aテーブル:
     code  name  kazu
     5       a         50
     6       b         111
     1       a         10
     2       b         10
     3       c          10
     4       d         10

    上記のように動的ではないSQL文ですと、Gridviewにnameがaのレコードだけを表示させることができていますが、
    例えば、(NAME = 'a') の 「a」の部分を「TextBox1.text」の値にして、そのSQLの結果をGridviewに
    表示ということができません。
    (aspx.vbの中にコードを書くのではなく、Dataset2を使って、行いたい。VSの機能を使って…)

    ご教授いただけないでしょうか。宜しくお願い致します。


    開発環境
    VB2010 ASP
    .net Framework4
    Oracle11

    2013年3月8日 10:08

回答

  • > 例えば、(NAME = 'a') の 「a」の部分を「TextBox1.text」の値にして、
    > そのSQLの結果をGridviewに表示ということができません。

    SELECT クエリをパラメータ化して、Fill, GetData メソッドの引数としてパラメータを渡すようにすればできます。

    クエリの「パラメータ化」ってわかりますよね? それがわからないと話が通じないので、わからなければ検索などして調べてください。調べても分からなければ聞いてください。

    以下のページは SQL Server の場合ですが、これと同じような手順で型付 DataSet + TableAdapter をデザイナで自動生成させて使っているのですよね?

    7.6 データコンポーネント機能による
     データアクセスコンポーネントの開発
    http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_01.html

    であれば、上記の Page 3 にある「D. テーブルアダプタへのクエリ追加」に書いてあるようにすれば良いはずです。

    • 回答の候補に設定 佐伯玲 2013年3月13日 1:53
    • 回答としてマーク 佐伯玲 2013年3月15日 5:48
    2013年3月9日 0:31
  • > 「@」は使えないのでしょうか?

    パラメータおよびパラメータのプレースホルダの名前付けや指定方法はプロバイダによって異なります。「@」は SQL Server 用の System.Data.SqlClient のみで使用されます。

    パラメーターおよびパラメーターのデータ型の構成 (ADO.NET)
    http://msdn.microsoft.com/ja-jp/library/yy6y35y8%28v=vs.100%29.aspx

    ODP.NET も System.Data.OracleClient と同じ :parmname 形式でいいはずです。

    <追伸>

    ODP.NET の OracleCommand には BindByName プロパティ(バインドするパラメータを名前で指定するか位置で指定するかを設定)があって、デフォルトで false になっているそうですので注意してください。
     
    Oracle Data Provider for .NET (ODP.NET) でデータベースアクセス(パラメータ)
     http://rararahp.blog69.fc2.com/blog-entry-65.html

    • 編集済み SurferOnWww 2013年3月9日 5:56 追伸追加
    • 回答の候補に設定 佐伯玲 2013年3月13日 1:53
    • 回答としてマーク 佐伯玲 2013年3月15日 5:48
    2013年3月9日 5:46
  • > 「Form」の「txt_name」のtextを読み取る

    もっとスマートなやり方があると思いますが・・・

    まぁ、それは今後勉強しておぼえるとして、もっと大事なこととして、ユーザー入力の検証は必ずやるようにしてください。

    パラメータ化したので、SQL インジェクションはほぼ防止できると思いますが、それでも何をするかわからない悪意のあるユーザーの入力を検証することは必須です。

    • 回答の候補に設定 佐伯玲 2013年3月13日 1:53
    • 回答としてマーク 佐伯玲 2013年3月15日 5:48
    2013年3月9日 9:35

すべての返信

  • > 例えば、(NAME = 'a') の 「a」の部分を「TextBox1.text」の値にして、
    > そのSQLの結果をGridviewに表示ということができません。

    SELECT クエリをパラメータ化して、Fill, GetData メソッドの引数としてパラメータを渡すようにすればできます。

    クエリの「パラメータ化」ってわかりますよね? それがわからないと話が通じないので、わからなければ検索などして調べてください。調べても分からなければ聞いてください。

    以下のページは SQL Server の場合ですが、これと同じような手順で型付 DataSet + TableAdapter をデザイナで自動生成させて使っているのですよね?

    7.6 データコンポーネント機能による
     データアクセスコンポーネントの開発
    http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_01.html

    であれば、上記の Page 3 にある「D. テーブルアダプタへのクエリ追加」に書いてあるようにすれば良いはずです。

    • 回答の候補に設定 佐伯玲 2013年3月13日 1:53
    • 回答としてマーク 佐伯玲 2013年3月15日 5:48
    2013年3月9日 0:31
  • 回答ありがとうございます。

    クエリのパラメータ化も意味合いは分かるのですが、確実に分かるとは言えないレベルです。
    とりあえず検索して勉強中です。
    ただ今、お教えいただいたページの通り行おうとしているのですが、
    Fill,GetData()に、
    「SELECT CODE,NAME,KAZU FROM TEST_A WHERE (NAME = @xname) ORDER BY CODE」
    と書いても、サイトに記載しているとおりに動きません。
    「SELECTステートメントは生成されました。'@'付近のWHERE句にエラーがあります。
    クエリテキストを解析できません。」
    と表示されます。
    「@」は使えないのでしょうか? ただサイトの説明を見ても、パラメータは@から始まる
    文字で設定しているようですし、色々調べているのですが分かりません。
    プロパティのParametersの部分なども色々触ったりしているのですが分からない状態です。
    悪い部分がお分かりでしたらお教えいただきたいです。
    宜しくお願い致します。

    2013年3月9日 4:56
  • > 「@」は使えないのでしょうか?

    パラメータおよびパラメータのプレースホルダの名前付けや指定方法はプロバイダによって異なります。「@」は SQL Server 用の System.Data.SqlClient のみで使用されます。

    パラメーターおよびパラメーターのデータ型の構成 (ADO.NET)
    http://msdn.microsoft.com/ja-jp/library/yy6y35y8%28v=vs.100%29.aspx

    ODP.NET も System.Data.OracleClient と同じ :parmname 形式でいいはずです。

    <追伸>

    ODP.NET の OracleCommand には BindByName プロパティ(バインドするパラメータを名前で指定するか位置で指定するかを設定)があって、デフォルトで false になっているそうですので注意してください。
     
    Oracle Data Provider for .NET (ODP.NET) でデータベースアクセス(パラメータ)
     http://rararahp.blog69.fc2.com/blog-entry-65.html

    • 編集済み SurferOnWww 2013年3月9日 5:56 追伸追加
    • 回答の候補に設定 佐伯玲 2013年3月13日 1:53
    • 回答としてマーク 佐伯玲 2013年3月15日 5:48
    2013年3月9日 5:46
  • ありがとうございました。

    まだ記述方法などがきれいではない気がしますができました。

    :xname のような書き方をし、あとは、ObjectDataSourceの中のパラメータの定義で、「Form」の「txt_name」のtextを読み取る

    ように書きました。

    これで、サイト内の「txt_name」に格納されているデータがWhere句の条件になり、特定レコードだけを抽出できました。

    サイト内にtxt_nameのようなものを作らなくても良いような、いい記述方法もありそうですが、とりあえず一歩前進しました。

    この度は本当にありがとうございました。

    2013年3月9日 7:15
  • > 「Form」の「txt_name」のtextを読み取る

    もっとスマートなやり方があると思いますが・・・

    まぁ、それは今後勉強しておぼえるとして、もっと大事なこととして、ユーザー入力の検証は必ずやるようにしてください。

    パラメータ化したので、SQL インジェクションはほぼ防止できると思いますが、それでも何をするかわからない悪意のあるユーザーの入力を検証することは必須です。

    • 回答の候補に設定 佐伯玲 2013年3月13日 1:53
    • 回答としてマーク 佐伯玲 2013年3月15日 5:48
    2013年3月9日 9:35