我想用
sqlid = new SqlCommand("SELECT Proj_id FROM Proj_details WHERE Proj_name = " +
strprojname, con);
con.Open();
id = (int)sqlid.ExecuteScalar();
这里我想检索我知道项目名称的特定项目的项目ID。这里strprojname
是一个包含项目名称的字符串变量。是否正确使用如上所述...如果使用,我会得到例外。
我该如何纠正?
答案 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):强>
你缺少引号:
"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'
无效。
您没有转义项目名称,这可能意味着SQL注入攻击成为可能。
<强>解决方案:强>
我建议您使用参数化查询:
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。