【问题标题】:using (SqlDataReader reader = cmd.ExecuteReader()) error asp.net mvc5使用 (SqlDataReader reader = cmd.ExecuteReader()) 错误 asp.net mvc5
【发布时间】:2020-06-18 05:37:46
【问题描述】:

即使我检查过并且我的数据库中确实有此参数,我也会收到此错误:

参数化查询“(@UserName nvarchar(4000))SELECT Email AS Email FROM AspNetUsers”需要参数“@UserName”,但未提供该参数。

这是在我的 AccountController 中:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> SendConfirmationMail() // resend confirmation link in case the users haven't received it 
{
    string res = null;
    string connection = GetConnectionString("DefaultConnection");
    using (SqlConnection myConnection = new SqlConnection(connection))

    {
        myConnection.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT Email AS Email FROM AspNetUsers WHERE UserName = @UserName";
        cmd.Connection = myConnection;
        cmd.Parameters.AddWithValue("@UserName", EConfUser);

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            if (reader.HasRows)
            {
                if (reader.Read())
                {
                    res = reader["Email"].ToString(); // get user's email from db
                    var user = await UserManager.FindByEmailAsync(res); // find applicationuser user by email
                                                                        //update user's email link date
                    UpdateEmailLinkDate(EConfUser);
                    // generate email conf token and send it
                    codeType = "EmailConfirmation";
                    await SendEmail("ConfirmEmail", "Account", user, res, "WelcomeEmail", "Confirm your account");
                }
                myConnection.Close();
            }
        }
    }
    return RedirectToAction("ConfirmationEmailSent", "Account");
}

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 您似乎将NULL 值传递给@UserName 参数(您的EConfuser 值为空)。参考这个*.com/a/8530911/311255

标签: asp.net-mvc-5


【解决方案1】:

试试这个:

cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = EConfUser ?? 
(object)DBNull.Value;

【讨论】:

  • 我应该用这个代替什么?
  • cmd.Parameters.AddWithValue("@UserName", EConfUser);
  • 非常感谢,它成功了!在我能够这样做之后,我会支持你的答案:))