Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在SELECT SqlCommand中替换SQLParameter?_C#_Ado.net - Fatal编程技术网

C# 如何在SELECT SqlCommand中替换SQLParameter?

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

在现有的代码库中有硬编码的SQL,我希望避免SQL注入

下面的代码使用SqlCommand和SqlParameters。查询不返回任何数据。但是,当我删除这些参数时,查询将返回正确的结果

如何将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
  • 可识别模式
  • 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,在这样的情况下评论会更舒服。