如何在 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();

我也尝试过使用

的替代方案,但没有成功
  1. SqlCommand.ExecuteReader 和 SqlDataReader
  2. ID一次性图案
  3. 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