找不到的记录是/是= -1

时间:2013-12-30 07:53:08

标签: c# asp.net asp.net-mvc c#-4.0

我是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; }
    }
}

2 个答案:

答案 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)。然后,使用以下逻辑验证密码:

  1. 查询数据库以查找尝试登录的用户。
  2. 散列提交的密码,并将其与数据库中的散列数据进行比较。
  3. 如果匹配,则密码正确。
  4. BCrypt.net这样的库将为您完成第二步,您需要做的就是将HashPassword()的结果存储在数据库中,并将其反馈回VerifyPassword()函数。

    另见:

答案 1 :(得分:0)

  

在读取所有行之前,不会设置RecordsAffected属性   你关闭了SqlDataReader。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.recordsaffected%28v=vs.110%29.aspx

  

IsClosed和RecordsAffected是您可以调用的唯一属性   在SqlDataReader关闭后。虽然记录受影响   可以在SqlDataReader存在时访问属性,始终调用   在返回RecordsAffected的值之前关闭以保证   准确的回报值。

http://msdn.microsoft.com/en-us/library/System.Data.SqlClient.SqlDataReader%28v=vs.110%29.aspx