我是MVC的新手,并且已经分配了一个任务,可以在普通的旧SQL查询中进行注册和登录页面等。之后会有进展。我成功完成了注册页面,它做得很完美,但问题出现在登录页面中,它为sqlreader返回-1,我传递正确的值,即使调试显示正确的值,但它仍然表现得没有被发现。自定义错误: 找不到任何记录/ = =
代码:
视图:
@using(Html.BeginForm("loginResult", "Home", FormMethod.Post, new {id="loginForm"}))
{
<div>
<i>@Html.Label("Email:")</i>
@Html.TextBox("txtboxEmail")
</div>
<div>
<i>@Html.Label("Password:")</i>
@Html.Password("txtboxPassword")
</div>
<div>
<button type="submit" id="btnLogin" name="Command" value="Login">Login</button>
</div>
}
控制器:
[HttpPost]
public ActionResult loginResult(String command, FormCollection formData)
{
if (command == "Login")
{
var email = formData["txtboxEmail"];
var pwd = formData["txtboxPassword"];
String conStr = "Data Source=HUNAIN-PC;Initial Catalog=registration;User ID=sa;Password=abc123!@#";
database db = new database();
var status = db.Login_db(email, pwd, conStr);
ViewBag.Message = status.Message;
}
return View();
}
public ActionResult login()
{
ViewBag.Message = "Login";
return View();
}
模型:
public ConnectionStatus Login_db( String email, String pwd, String conStr)
{
SqlConnection sqlCon = new SqlConnection(conStr);
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = sqlCon;
sqlCom.CommandText = "select userEmail, userPwd from tblRegister where userEmail=@email AND userPwd=@pwd";
sqlCom.Parameters.AddWithValue("@email", email);
sqlCom.Parameters.AddWithValue("@pwd", pwd);
ConnectionStatus connectStatus = new ConnectionStatus();
int row_aff;
try
{
sqlCon.Open();
SqlDataReader dr = sqlCom.ExecuteReader();
row_aff = dr.RecordsAffected;
connectStatus.Message = "No of records being found are/is ="+ row_aff;
}
catch (Exception ex)
{
connectStatus.Message = ex.Message;
}
finally
{
sqlCon.Close();
}
return connectStatus;
}
}
}
ConnectionStatus是一个具有MESSAGE属性的类。
namespace LoginSys.Models
{
public class ConnectionStatus
{
public String Message { get; set; }
}
}
答案 0 :(得分:3)
SqlDataReader.RecordsAffected
returns -1 for all SELECT statements。它不代表返回的行数。文档解释了RecordsAffected
属性:
更改,插入或删除的行数;如果没有行受影响或语句失败,则为0;和SELECT语句为-1。
要获取返回的行数,可以使用如下查询:
SELECT COUNT(*) FROM tblRegister WHERE (conditions)
使用代码访问计数:
var count = sqlCommand.ExecuteScalar();
顺便说一句,看起来你在数据库中存储了一个明文密码。如果是这样的话,我恳请你改变这个。如果有人访问您的数据库,他们可以检索用户的密码。由于人们倾向于使用相同的密码,因此用户的其他帐户(如电子邮件和银行帐户)也可能会受到损害。
更安全的方法是使用为密码设计的哈希算法存储哈希密码(类似于bcrypt或PBKDF2,特别是不是类似SHA-1或MD5)。然后,使用以下逻辑验证密码:
像BCrypt.net这样的库将为您完成第二步,您需要做的就是将HashPassword()
的结果存储在数据库中,并将其反馈回VerifyPassword()
函数。
另见:
答案 1 :(得分:0)
在读取所有行之前,不会设置RecordsAffected属性 你关闭了SqlDataReader。
IsClosed和RecordsAffected是您可以调用的唯一属性 在SqlDataReader关闭后。虽然记录受影响 可以在SqlDataReader存在时访问属性,始终调用 在返回RecordsAffected的值之前关闭以保证 准确的回报值。
http://msdn.microsoft.com/en-us/library/System.Data.SqlClient.SqlDataReader%28v=vs.110%29.aspx