-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

尝试以下代码示例,它对查询进行参数化并使用正确的结果值转换

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 回答
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 回答
1

以下是一些突出的事情:

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

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

于 2012-08-07T07:53:07.870 回答