none
SqlCommand.Parametersを使ったSELECT RRS feed

  • 質問

  • こんばんは。

    TextBox の値をSQL文に代入してのコードは、セキュリティ上問題があるとのことです。
    "SELECT ID, Name, GroupID, GroupName WHERE GroupID = '" + TextBox.Text + "';";
    などは、入力された値にSQL を操作させる可能性があって良くないのでしょう。

    また、Parameters を使うとそうした問題を避けることが出来るらしいですね。

    とのことなので、
    上記のSQLをSqlCommand.Parameters を使ったSQL文にして、特定のGroupIDのデータを抽出したいと思っています。
    このとき、
    string sqlString = "SELECT ID, Name, GroupID, GroupName WHERE GroupID = @GroupID";
    として
    その後、どうしたらこのParameters に値を代入させられるのでしょうか?
    下記のコードから先に進みません。

    sqlConnection cn;
    sqlDataApapter da;
         ------- 処理
    string sqlString = "";
    command = new SqlCommand(sqlString, cn);
    cmd.Parameters.Add("@GroupID ", SqlDbType.Int, 20, "GroupID ");
    da.SelectCommand = cmd;
         ------- 処理

    などとして、このParameters に値を代入させてDataGridViewに表示させるコードを作りたいのです。
    InsertやUpdateなどでのParameterは、よく使いますが、Selectのときに使ったことがありません。

    よろしくお願いします。
    2010年2月13日 9:33

回答

すべての返信

  • TextBox の値をSQL文に代入してのコードは、セキュリティ上問題があるとのことです。
    "SELECT ID, Name, GroupID, GroupName WHERE GroupID = '" + TextBox.Text + "';";
    などは、入力された値にSQL を操作させる可能性があって良くないのでしょう。

    また、Parameters を使うとそうした問題を避けることが出来るらしいですね。

    とのことなので、
    上記のSQLをSqlCommand.Parameters を使ったSQL文にして、特定のGroupIDのデータを抽出したいと思っています。
    このとき、
    string sqlString = "SELECT ID, Name, GroupID, GroupName WHERE GroupID = @GroupID";
    として
    その後、どうしたらこのParameters に値を代入させられるのでしょうか?
    下記のコードから先に進みません。

    sqlConnection cn;
    sqlDataApapter da;
         ------- 処理
    string sqlString = "";
    command = new SqlCommand(sqlString, cn);
    cmd.Parameters.Add("@GroupID ", SqlDbType.Int, 20, "GroupID ");
    da.SelectCommand = cmd;
         ------- 処理

    などとして、このParameters に値を代入させてDataGridViewに表示させるコードを作りたいのです。
    InsertやUpdateなどでのParameterは、よく使いますが、Selectのときに使ったことがありません。


    cmd.Parameters.Add( new SqlParameter("@GroupID ", 20) );  // 修正した。

    これでいけると思います。
    SqlCommand.Parameters は、SqlParameter オブジェクトの Collection なので、
    SqlCommand.Parameters.Add メソッドには SqlParameter のインスタンスを生成して渡してください。

    簡単な事例については、こちらを参考にどうぞ。

    http://itpro.nikkeibp.co.jp/article/MAG/20070608/274192/


    2010年2月13日 11:39
    モデレータ
  • 一応、参考までにAddWithValueメソッドもあります。

    SqlParameterCollection.AddWithValue メソッド
    http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlparametercollection.addwithvalue(VS.80).aspx

    SqlParameterCollection.Add メソッドも戻り値を受け取る場合などに使いますので、両方のメソッドの使い方をマスターすることをお勧めします。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年2月13日 15:09
    モデレータ
  • > その後、どうしたらこのParameters に値を代入させられるのでしょうか?

    どこに代入したらいいのかが分からないのですよね? SqlParameter.Value プロパ
    ティに代入します。具体例は下記のページが参考になると思います。

    SqlCommand.Parameters プロパティ
    http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlcommand.parameters.aspx


    MSDN ライブラリなど調べるという努力も自分のスキルアップには役立つはずです。
    Web で検索するのは時間がかかって面倒なので、 Microsoft のサイトからドキュメ
    ントをダウンロードして使うことをお勧めします。

    MSDN Library for Visual Studio 2008 SP1 (2008年12月更新版)
    http://www.microsoft.com/downloads/details.aspx?FamilyID=7bbe5eda-5062-4ebb-83c7-d3c5ff92a373&DisplayLang=ja

    • 回答としてマーク yasheeki 2010年2月14日 14:50
    2010年2月14日 3:07
  • みなさん、有難うございます。
    すべての回答が役に立ち、Parameters に値を代入することができました。
    2010年2月14日 13:24