C# 如何在SELECT SqlCommand中替换SQLParameter?
在现有的代码库中有硬编码的SQL,我希望避免SQL注入 下面的代码使用SqlCommand和SqlParameters。查询不返回任何数据。但是,当我删除这些参数时,查询将返回正确的结果 如何将SqlParameters与SELECT语句一起使用C# 如何在SELECT SqlCommand中替换SQLParameter?,c#,ado.net,C#,Ado.net,在现有的代码库中有硬编码的SQL,我希望避免SQL注入 下面的代码使用SqlCommand和SqlParameters。查询不返回任何数据。但是,当我删除这些参数时,查询将返回正确的结果 如何将SqlParameters与SELECT语句一起使用 string atUsername = "@username"; //does not work //string atUsername = "Demo1"; //THIS WORKS string at
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();
我也尝试过使用其他方法,但没有成功
cmd.Parameters.Add(atUsername
替换为
SqlParameter pUsername=newsqlparameter();
pUsername.ParameterName=atUsername;
pUsername.Value=“Demo1”;
cmd.Parameters.Add(pUsername);“
另外,我听说过EntityFramework,但在这种情况下我不能使用EF(说来话长)。问题的根源在于在字符串文本中使用变量名:
WHERE username = '@username' AND password = '@password'
因此,sql server不会将它们视为变量名。相反,您正在搜索名为“@username”和密码为“@password”的用户。正确的方法是:
WHERE username = @username AND password = @password
问题的根源在于在字符串文字中使用变量名:
WHERE username = '@username' AND password = '@password'
因此,sql server不会将它们视为变量名。相反,您正在搜索名为“@username”和密码为“@password”的用户。正确的方法是:
WHERE username = @username AND password = @password
删除围绕变量名的包装…=@username为什么不将其作为答案@Evk@nikhilvartak还不习惯把答案这样的小事摆出来:)@Evk hehe true,在这种情况下进行评论会更舒服。删除“围绕变量名…”的包装=“@username”为什么不将其作为答案@Evk@nikhilvartak还不习惯把答案这样的小事说出来:)@Evk-hehe-true,在这样的情况下评论会更舒服。