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;
)。一旦你关闭了循环中的连接,读卡器就会关闭。