【问题标题】:How to get SqlParamter replaced in SELECT SqlCommand?如何在 SELECT SqlCommand 中替换 SqlParamter?
【发布时间】: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();

我也没有成功尝试过使用

的替代方法
  1. SqlCommand.ExecuteReader 和 SqlDataReader
  2. IDisposable 模式
  3. cmd.Parameters.Add(atUsername替换为

    SqlParameter pUsername = new SqlParameter(); pUsername.ParameterName = atUsername; pUsername.Value = "Demo1"; cmd.Parameters.Add(pUsername);"

附言。我听说过 EntityFramework,但在这种情况下我不能使用 EF(长话短说)。

【问题讨论】:

  • 删除围绕变量名称的包装。 ... = '@username'
  • 你为什么不把它作为答案? @Evk
  • @nikhilvartak 还没习惯把这么小的东西当作答案 :)
  • @Evk 呵呵,确实如此,在这种情况下发表评论会更舒服。

标签: c# ado.net


【解决方案1】:

问题的根源在于您在字符串文字中使用了变量名:

 WHERE username = '@username' AND password = '@password'

因此它们不会被 sql server 视为变量名。相反,您正在搜索名为“@username”和密码“@password”的用户。正确的做法是:

WHERE username = @username AND password = @password

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多