Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Asp.net 已经有一个打开的DataReader与此命令关联,必须先关闭它。为什么?_Asp.net_C# 4.0 - Fatal编程技术网

Asp.net 已经有一个打开的DataReader与此命令关联,必须先关闭它。为什么?

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 =

我在其他事件中也在同一页面中使用了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 = 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();