【发布时间】:2016-05-13 09:24:54
【问题描述】:
在现有的代码库中有硬编码的 SQL,我想避免 SQL 注入。
以下代码将 SqlCommand 与 SqlParameters 一起使用。该查询不返回任何数据。但是,当我删除参数时,查询会返回正确的结果。
如何在 SELECT 语句中使用 SqlParameters?
string atUsername = "@username"; //does not work
//string atUsername = "Demo1"; //THIS WORKS
string atPassword = "@password"; //does not work
//string atPassword = "222"; //THIS WORKS
string sql = @"SELECT userId, userName, password, status, roleId, vendorId
FROM users
WHERE username = '" + atUsername + "' AND password = '" + atPassword + "'";
SqlCommand cmd = new SqlCommand(sql);
cmd.Parameters.Add(atUsername, SqlDbType.NVarChar, 20);
cmd.Parameters[atUsername].Value = "Demo1";
//cmd.Parameters.AddWithValue //also does not work
cmd.Parameters.Add(atPassword, SqlDbType.NVarChar, 20);
cmd.Parameters[atPassword].Value = "222";
//cmd.Parameters.AddWithValue //also does not work
SqlConnection conn = new SqlConnection(connStr);
cmd.Connection = conn;
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);
Console.WriteLine(dt.Rows != null);
if (dt.Rows != null)
{
Console.WriteLine(dt.Rows.Count);
}
conn.Close();
conn.Dispose();
我也没有成功尝试过使用
的替代方法- SqlCommand.ExecuteReader 和 SqlDataReader
- IDisposable 模式
-
将
cmd.Parameters.Add(atUsername替换为SqlParameter pUsername = new SqlParameter(); pUsername.ParameterName = atUsername; pUsername.Value = "Demo1"; cmd.Parameters.Add(pUsername);"
附言。我听说过 EntityFramework,但在这种情况下我不能使用 EF(长话短说)。
【问题讨论】:
-
删除围绕变量名称的包装。 ... = '@username'
-
你为什么不把它作为答案? @Evk
-
@nikhilvartak 还没习惯把这么小的东西当作答案 :)
-
@Evk 呵呵,确实如此,在这种情况下发表评论会更舒服。