如何在 SELECT SqlCommand 中替换 SqlParamter?
How to get SqlParamter replaced in SELECT SqlCommand?
在现有代码库中有硬编码 SQL,我想避免 SQL 注入。
以下代码将 SqlCommand 与 SqlParameters 一起使用。查询没有 return 任何数据。但是,当我删除参数时,查询 returns 得到了正确的结果。
如何将 SqlParameters 与 SELECT 语句一起使用?
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
- ID一次性图案
将cmd.Parameters.Add(atUsername
替换为
SqlParameter pUsername = new SqlParameter();
pUsername.ParameterName = atUsername;
pUsername.Value = "Demo1";
cmd.Parameters.Add(pUsername);"
PS。我听说过 EntityFramework,但在这种情况下我不能使用 EF(长话短说)。
问题的根源在于您在字符串文字中使用了变量名:
WHERE username = '@username' AND password = '@password'
因此 sql 服务器不会将它们视为变量名。相反,您正在搜索名称为“@username”和密码为“@password”的用户。正确的方法是:
WHERE username = @username AND password = @password
在现有代码库中有硬编码 SQL,我想避免 SQL 注入。
以下代码将 SqlCommand 与 SqlParameters 一起使用。查询没有 return 任何数据。但是,当我删除参数时,查询 returns 得到了正确的结果。
如何将 SqlParameters 与 SELECT 语句一起使用?
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
- ID一次性图案
将
cmd.Parameters.Add(atUsername
替换为SqlParameter pUsername = new SqlParameter(); pUsername.ParameterName = atUsername; pUsername.Value = "Demo1"; cmd.Parameters.Add(pUsername);"
PS。我听说过 EntityFramework,但在这种情况下我不能使用 EF(长话短说)。
问题的根源在于您在字符串文字中使用了变量名:
WHERE username = '@username' AND password = '@password'
因此 sql 服务器不会将它们视为变量名。相反,您正在搜索名称为“@username”和密码为“@password”的用户。正确的方法是:
WHERE username = @username AND password = @password