2013-06-28 58 views
1
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(); 
} 

我用DataReader对象博士在同一页中的其他事件也... plz帮助....已经有一个与此命令关联的打开DataReader,它必须先关闭。为什么?

+0

您可能还需要来回UI – gsharp

回答

0

你为什么要两次调用ExecuteReader?一个就足够了

SqlDataReader dr = cmdr.ExecuteReader(); 
    if (dr.HasRows) 
    { 
     ----- 

您的代码还有其他问题。 Sql Injection是最危险的。经过时用户

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(); 

输入的值,并使用全球连接是一个不好的做法,因为你一直锁定一个昂贵的资源,您应该使用这样的代码。尝试使用using statement,打开连接,命令和读者,然后关闭并摧毁一切

// 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 
+0

史蒂夫数据访问分开,非常感谢你... Sql注入是我一直存在的问题....再次感谢你4教学! – user72

0

你已经打开了上面的行读卡器。我想你想:

SqlDataReader dr = cmdr.ExecuteReader(); 

if (dr.HasRows)//here showing the error as the title i gave. 

但也有其他的问题 - 如@Brad m个点出来(做参数化查询搜索)SQL注入,而你泄露你的命令对象 - 他们应该被封闭在using statements

我对con的定义有些紧张 - 它闻起来像某种全局变量。使用ADO.Net的一般模式是,在单个方法/代码块内,您应该创建一个新的SqlConnection对象(在using语句内),创建一个新的SqlCommand对象(在using语句内),打开连接,执行命令,处理结果(如果适用),然后退出using块,并让所有内容都清理干净。不要试图共享周围的物体。

0

你已经所以if

SqlDataReader dr = cmdr.ExecuteReader(); 

执行的读者,你应该利用现有的读者

dr.HasRows 
0

Initialy在你的SQL脚本仔细

避免

string str = "SELECT t1.UsrFLname from Registration t1 JOIN IMSLogin t2 on t1.RegId =  t2.RegId and t2.Uname = '" + Login1.UserName + "'"; 

使用

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(); 
相关问题