Asp.net 已经有一个打开的DataReader与此命令关联,必须先关闭它。为什么?
我在其他事件中也在同一页面中使用了datareader对象dr。。。Asp.net 已经有一个打开的DataReader与此命令关联,必须先关闭它。为什么?,asp.net,c#-4.0,Asp.net,C# 4.0,我在其他事件中也在同一页面中使用了datareader对象dr。。。 Plz help…您已经在上面的行中打开了读卡器。我想你想要: protected void Page_Load(object sender, EventArgs e) { MultiView1.ActiveViewIndex=0; string str = "SELECT t1.UsrFLname from Registration t1 JOIN IMSLogin t2 on t1.RegId =
Plz help…您已经在上面的行中打开了读卡器。我想你想要:
protected void Page_Load(object sender, EventArgs e)
{
MultiView1.ActiveViewIndex=0;
string str = "SELECT t1.UsrFLname from Registration t1 JOIN IMSLogin t2 on t1.RegId = t2.RegId and t2.Uname = '" + Login1.UserName + "'";
con.Open();
SqlCommand cmdr = new SqlCommand(str, con);
SqlDataReader dr = cmdr.ExecuteReader();
if (cmdr.ExecuteReader().HasRows)//here showing the error as the title i gave.
{
Session["userName"] = Login1.UserName.Trim();
string myStringVariable = "Welcome! ";
ClientScript.RegisterStartupScript(this.GetType(), "myAlert", "alert('" + myStringVariable + Login1.UserName + "');", true);
//dr.Dispose();
}
else
{
string myStringVariable = " No Username Found";
ClientScript.RegisterStartupScript(this.GetType(), "myAlert", "alert('" + myStringVariable + "');", true);
}
con.Close();
}
但是还有其他问题-正如@Brad M指出的SQL注入(对参数化查询进行搜索),并且您正在泄漏您的命令对象-它们应该包含在中
我还对
con
的定义有点紧张-它闻起来很像某种全局变量。使用ADO.Net的一般模式是,在单个方法/代码块中,您应该创建一个新的SqlConnection
对象(在using
语句中),创建一个新的SqlCommand
对象(在using
语句中),打开连接,执行命令,处理结果(如果适用)然后使用块退出,让一切都清理干净。不要尝试共享周围的SqlConnection
对象。为什么要调用ExecuteReader两次?一个就够了
SqlDataReader dr = cmdr.ExecuteReader();
if (dr.HasRows)//here showing the error as the title i gave.
您的代码还存在其他问题。Sql注入是最危险的。当传递用户输入的值时,应该使用这样的代码
SqlDataReader dr = cmdr.ExecuteReader();
if (dr.HasRows)
{
-----
而且,使用全局连接也是一种不好的做法,因为您会锁定昂贵的资源。尝试使用、打开连接、命令和读卡器,然后关闭并销毁所有内容
string str = "SELECT t1.UsrFLname from Registration t1 JOIN IMSLogin t2 on " +
"t1.RegId = t2.RegId and t2.Uname = @uname";
con.Open();
SqlCommand cmdr = new SqlCommand(str, con);
cmdr.Parameters.AddWithValue("@uname", Login1.UserName);
SqlDataReader dr = cmdr.ExecuteReader();
您已经在上执行了reader
// CREATE CONNECTION AND COMMAND
using(SqlConnection con = new SqlConnection(conString))
using(SqlCommand cmdr = new SqlCommand(str, con))
{
// OPEN THE CONNECTION
con.Open();
cmdr.Parameters.AddWithValue("@uname", Login1.UserName);
using(SqlDataReader dr = cmdr.ExecuteReader())
{
// USE
....
} // CLOSE AND DESTROY
} // CLOSE AND DESTROY
因此,在if
中,您应该使用现有的读卡器
SqlDataReader dr = cmdr.ExecuteReader();
首先,在sql脚本中要小心
避免
dr.HasRows
使用
别忘了
string str = "SELECT t1.UsrFLname from Registration t1 JOIN IMSLogin t2 on t1.RegId = t2.RegId and t2.Uname = @username";
con.Open();
SqlCommand cmdr = new SqlCommand(str, con);
cmdr.Parameters.AddWithValue("@username", Login1.UserName);
SqlDataReader dr = cmdr.ExecuteReader();
if (dr.HasRows)
{
Session["userName"] = Login1.UserName.Trim();
string myStringVariable = "Welcome! ";
ClientScript.RegisterStartupScript(this.GetType(), "myAlert", "alert('" + myStringVariable + Login1.UserName + "');", true);
}
您可能还想将数据访问与UIsteve分开,非常感谢…Sql注入一直是我的问题…再次感谢您!!
string str = "SELECT t1.UsrFLname from Registration t1 JOIN IMSLogin t2 on t1.RegId = t2.RegId and t2.Uname = @username";
con.Open();
SqlCommand cmdr = new SqlCommand(str, con);
cmdr.Parameters.AddWithValue("@username", Login1.UserName);
SqlDataReader dr = cmdr.ExecuteReader();
if (dr.HasRows)
{
Session["userName"] = Login1.UserName.Trim();
string myStringVariable = "Welcome! ";
ClientScript.RegisterStartupScript(this.GetType(), "myAlert", "alert('" + myStringVariable + Login1.UserName + "');", true);
}
dr.Close();