Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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# 读卡器关闭时调用read的尝试无效错误_C#_Asp.net_Sql Server - Fatal编程技术网

C# 读卡器关闭时调用read的尝试无效错误

C# 读卡器关闭时调用read的尝试无效错误,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我正在为员工创建一个新的登录页面,遇到了一个错误 mDB.Open(); SqlCommand cmd; SqlDataReader rdr; String strSql1 = "SELECT * FROM Employee "; cmd = new SqlCommand(strSql1, mDB); rdr = cmd.ExecuteReader(); while (rdr.Read() == true) { i

我正在为员工创建一个新的登录页面,遇到了一个错误

    mDB.Open();
    SqlCommand cmd;
    SqlDataReader rdr;
    String strSql1 = "SELECT * FROM Employee ";
    cmd = new SqlCommand(strSql1, mDB);
    rdr = cmd.ExecuteReader();

    while (rdr.Read() == true)
    {
        if (txtUsername.Text == (string)rdr["eUserName"] &&
            txtPassword.Text == (string)rdr["ePassword"])
         {
            Session["sFlag"] = "T"; // sFlag = "T" means user has logged in
            Session["sFirstName"] = rdr["eFirstName"];
            Session["sLastName"] = rdr["eLastName"];
            Session["sUsername"] = rdr["eUserName"];
            btnLogout.Visible = true;
            btnLogin.Visible = false;
            mDB.Close();

        } //end of if
    } //end of while loop
 // userid and password not matched, hence login unsuccessful
    Session["sFlag"] = "F";
    Session["sName"] = "";
    Session["sUsername"] = "";
    lblMessage.Text = "Username and password does not match- please try again.  ";
    mDB.Close();
}
protected void btnLogout_Click(object sender, EventArgs e)
{
    btnLogout.Visible = false;
    Session["sFlag"] = "L"; // L for logout
    Session["sFirstName"] = "";
    Session["sUsername"] = "";

}

它适用于我的其他客户登录页面。请帮忙?我对这个很陌生。非常感谢大家

您正在关闭读取循环内的连接(使用
mDB.Close();
)。那根本不是一件好事。要解决此问题,请在循环结束后移动要完成的关闭调用:

while (rdr.Read() == true)
{
    if (txtUsername.Text == (string)rdr["eUserName"] &&
        txtPassword.Text == (string)rdr["ePassword"])
    {
        Session["sFlag"] = "T"; // sFlag = "T" means user has logged in
        Session["sFirstName"] = rdr["eFirstName"];
        Session["sLastName"] = rdr["eLastName"];
        Session["sUsername"] = rdr["eUserName"];
        btnLogout.Visible = true;
        btnLogin.Visible = false;


    } //end of if
} //end of while loop
mDB.Close();

您正在关闭读取循环内的连接(使用
mDB.Close();
)。那根本不是一件好事。要解决此问题,请在循环结束后移动要完成的关闭调用:

while (rdr.Read() == true)
{
    if (txtUsername.Text == (string)rdr["eUserName"] &&
        txtPassword.Text == (string)rdr["ePassword"])
    {
        Session["sFlag"] = "T"; // sFlag = "T" means user has logged in
        Session["sFirstName"] = rdr["eFirstName"];
        Session["sLastName"] = rdr["eLastName"];
        Session["sUsername"] = rdr["eUserName"];
        btnLogout.Visible = true;
        btnLogin.Visible = false;


    } //end of if
} //end of while loop
mDB.Close();

您正在关闭循环中的连接,因此
rdr.Read()
将使用关闭的连接检查是否有第二条记录。这将失败

相反,您应该使用
using
-语句,该语句确保即使发生错误,连接也会关闭:

using(var mDB = new SqlConnection(connectionString))
{
    mDB.Open();
    using(var cmd = new SqlCommand("SELECT * FROM Employee", mDB))
    using(var rdr = cmd.ExecuteReader())
    {

        while (rdr.Read() == true)
        {
            if (txtUsername.Text == (string)rdr["eUserName"] &&
                txtPassword.Text == (string)rdr["ePassword"])
             {
                Session["sFlag"] = "T"; // sFlag = "T" means user has logged in
                Session["sFirstName"] = rdr["eFirstName"];
                Session["sLastName"] = rdr["eLastName"];
                Session["sUsername"] = rdr["eUserName"];
                btnLogout.Visible = true;
                btnLogin.Visible = false;        
            } //end of if
        } //end of while loop
    }
}
旁注:您正在选择所有记录并在客户端进行筛选。相反,您应该
WHERE
在数据库中进行筛选:

using(var cmd = new SqlCommand("SELECT * FROM Employee WHERE eUserName=@Username AND @ePassword=PassWord", mDB))
{
    cmd.Parameters.Add("@UserName", SqlDbType.Varchar).Value = txtUsername.Text;
    cmd.Parameters.Add("@ePassword", SqlDbType.Varchar).Value = txtPassword.Text;
    // ...
}

您正在关闭循环中的连接,因此
rdr.Read()
将使用关闭的连接检查是否有第二条记录。这将失败

相反,您应该使用
using
-语句,该语句确保即使发生错误,连接也会关闭:

using(var mDB = new SqlConnection(connectionString))
{
    mDB.Open();
    using(var cmd = new SqlCommand("SELECT * FROM Employee", mDB))
    using(var rdr = cmd.ExecuteReader())
    {

        while (rdr.Read() == true)
        {
            if (txtUsername.Text == (string)rdr["eUserName"] &&
                txtPassword.Text == (string)rdr["ePassword"])
             {
                Session["sFlag"] = "T"; // sFlag = "T" means user has logged in
                Session["sFirstName"] = rdr["eFirstName"];
                Session["sLastName"] = rdr["eLastName"];
                Session["sUsername"] = rdr["eUserName"];
                btnLogout.Visible = true;
                btnLogin.Visible = false;        
            } //end of if
        } //end of while loop
    }
}
旁注:您正在选择所有记录并在客户端进行筛选。相反,您应该
WHERE
在数据库中进行筛选:

using(var cmd = new SqlCommand("SELECT * FROM Employee WHERE eUserName=@Username AND @ePassword=PassWord", mDB))
{
    cmd.Parameters.Add("@UserName", SqlDbType.Varchar).Value = txtUsername.Text;
    cmd.Parameters.Add("@ePassword", SqlDbType.Varchar).Value = txtPassword.Text;
    // ...
}

那是什么在循环内部将要做什么,你认为呢?(也许你应该在它下面的一行添加一个
break;
)。一旦你关闭了循环中的连接,读卡器就会关闭。那是什么
mDB.Close()在循环内部将要做什么,你认为呢?(也许你应该在它下面的一行添加一个
break;
)。一旦你关闭了循环中的连接,读卡器就会关闭。