基于C#的SQL查询抛出异常

时间:2012-08-07 07:49:41

标签: c# sql ado.net

我想用

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

这里我想检索我知道项目名称的特定项目的项目ID。这里strprojname是一个包含项目名称的字符串变量。是否正确使用如上所述...如果使用,我会得到例外。

我该如何纠正?

5 个答案:

答案 0 :(得分:2)

使用如下所示,因为项目名称是字符串..

sqlid = new SqlCommand("select Proj_id from Proj_details where Proj_name='"+strprojname+"'" , con);  
con.Open(); id = (int)sqlid.ExecuteScalar();

答案 1 :(得分: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());

答案 2 :(得分:2)

<强>问题(S):

  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注入攻击成为可能。

  3. <强>解决方案:

    我建议您使用参数化查询:

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

    这样,您不必担心引号,转义项目名称以及类似问题(如果您不使用参数,则必须自己照顾)。

答案 3 :(得分: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();
}

答案 4 :(得分:1)

以下是一些突出的事情:

  • 您缺少项目名称周围的引号。改为:

    sqlid = new SqlCommand("select Proj_id from Proj_details where Proj_name='"+strprojname + "'" , con);
    
  • 您不应仅通过将字符串附加在一起来构建SQL查询。这可以让您了解SQL注入攻击。使用parameterized queries