-2

使いたい

sqlid = new SqlCommand("SELECT Proj_id FROM Proj_details WHERE Proj_name = " +
                       strprojname, con);
con.Open();
id = (int)sqlid.ExecuteScalar();

ここでは、プロジェクト名がわかっている特定のプロジェクトのプロジェクト ID を取得したいと考えています。strprojnameプロジェクト名を含む文字列変数を次に示します。上記のように使用するのは正しいですか...そのように使用すると例外が発生します。

これを修正するにはどうすればよいですか?

4

5 に答える 5

2

問題:

  1. 引用符がありません:

    "SELECT Proj_id FROM Proj_details WHERE Proj_name = " + strprojname
    

    次のような文字列になる可能性があります

    SELECT Proj_id FROM Proj_details WHERE Proj_name = ABC
    --                                                 ^^^
    --                                    should be 'ABC' or N'ABC'
    

    これは無効です。

  2. プロジェクト名をエスケープしないと、SQL インジェクション攻撃が可能になる可能性があります。

解決:

パラメータ化されたクエリを使用することをお勧めします。

var sqlid = new SqlCommand("SELECT … WHERE Proj_name = @projectName", con)
sqlid.Parameters.Add("@projectName", strprojname);

このように、引用符、プロジェクト名のエスケープ、および同様の問題について心配する必要はありません (パラメーターを使用しない場合は、自分で処理する必要があります)。

于 2012-08-07T07:57:29.663 に答える
2

次のようにすると、フローが改善されます。

con.Open();
//string introduced only to shorten lines
string projQuery = "SELECT Proj_id FROM Proj_details WHERE Proj_name = @ProjectName";
using(SqlCommand sqlid = new SqlCommand(projQuery, con))
{
    sqlid.Parameters.AddWithValue("ProjectName", strprojname);
    id = (int)sqlid.ExecuteScalar();
}
于 2012-08-07T07:57:36.870 に答える
2

プロジェクト名は文字列なので、以下のように使用します..

sqlid = new SqlCommand("select Proj_id from Proj_details where Proj_name='"+strprojname+"'" , con);  
con.Open(); id = (int)sqlid.ExecuteScalar();
于 2012-08-07T07:52:24.033 に答える
2

クエリをパラメーター化し、適切な結果値の変換を使用する次のコード例を試してください。

sqlid = new SqlCommand("SELECT Proj_id FROM Proj_details WHERE Proj_name = @pname", con);
sqlid.Parameters.AddWithValue("@pname", strprojname);
con.Open();
id = Convert.ToInt32(sqlid.ExecuteScalar());
于 2012-08-07T07:56:17.977 に答える
1

以下に、際立った点をいくつか示します。

  • プロジェクト名の前後に引用符がありません。への変更:

    sqlid = new SqlCommand("select Proj_id from Proj_details where Proj_name='"+strprojname + "'" , con);
    
  • 文字列を追加するだけで SQL クエリを作成しないでください。これにより、SQL インジェクション攻撃にさらされます。パラメータ化されたクエリを使用します。

于 2012-08-07T07:53:07.870 に答える