C# 将varchar转换为int mvc时,转换失败#

C# 将varchar转换为int mvc时,转换失败#,c#,asp.net-mvc,ado.net,C#,Asp.net Mvc,Ado.net,我得到一个运行时错误 将varchar转换为int时转换失败 使用此代码: public ActionResult Index(Model1 m) { string q = "select username, password from login where username=@username and password=@password "; con.Open(); SqlCommand cmd = new SqlCommand(q, con); cmd

我得到一个运行时错误

将varchar转换为int时转换失败

使用此代码:

public ActionResult Index(Model1 m)
{
    string q = "select username, password from login where username=@username and password=@password ";

    con.Open();

    SqlCommand cmd = new SqlCommand(q, con);
    cmd.Parameters.AddWithValue("@username", m.username).ToString();
    cmd.Parameters.AddWithValue("@password", m.password).ToString();

    SqlDataReader dr = cmd.ExecuteReader();

    if (dr.Read())   // getting error at this point
    {
        return RedirectToAction("upload");
    }
    else
    {
        ViewData["Message"] = "invalid username or password";
    }

    con.Close();

    return View();
}

您需要做的一切都是使用实体框架,而不是这种古老、冗长的运行SQL的方式,这种方式不利于良好的OO设计实践(控制器中的业务逻辑层和数据访问层之间的关注点分离)

至少,看看你的数据访问——它会让你的代码更干净,你的生活更轻松


使用第一个链接的答案开发一个类,该类对您的密码进行加密和散列,并存储散列而不是纯文本密码,并调用它以确保您的密码得到安全保存。以明文形式存储密码是HaveIBeenPwned等服务需要存在的原因;人们重复使用密码,当你将密码存储在明文中,并且你的系统遭到黑客攻击时,它将显示一个很好的用户名查找:密码可以在其他被入侵的地方使用,而黑客所拥有的只是用户名。部分原因是用户重复使用密码的错误,但大部分原因是您没有安全地保存他们的详细信息。请将此列为优先顺序

1。不要使用
AddWithValue
。2.不要为此使用
ExecuteReader
。使用
ExecuteScalar
(并选择1而不是2列)。3.看起来您正在存储纯文本密码-不要这样做。取而代之的是,储存一份腌制的土豆条。4.看起来您正在为SqlConnection使用一个字段-这也是一个错误5。您拥有的两个
.ToString()
是没有意义的。您应该使用
您的SqlCommand,在关闭连接之前不要返回。总而言之,这段代码中有大量(几乎全部)是有问题的,可能应该全部扔掉并重新编写。作为一个愚蠢的小检查,请确保您的用户名和密码成员实际上是以字符串形式键入的。这里有一个关于@zoharpeled为什么不应该使用
AddWithValue
的参考: