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 对象 dr ......请帮助......

4

4 回答 4

0

最初在你的 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();
于 2013-06-28T14:25:04.283 回答
0

您已经在上面的行中打开了阅读器。我想你想要:

 SqlDataReader dr = cmdr.ExecuteReader(); 

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

但是还有其他问题-@Brad M 指出的 SQL 注入(对参数化查询进行搜索),并且您正在泄漏命令对象-它们应该包含在usingstatements 中

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

于 2013-06-28T14:22:27.413 回答
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 语句,打开连接、命令和阅读器,然后关闭并销毁所有内容

 // 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
于 2013-06-28T14:22:35.863 回答
0

你已经执行了阅读器

SqlDataReader dr = cmdr.ExecuteReader();

所以在if,你应该使用现有的阅读器

dr.HasRows
于 2013-06-28T14:23:12.187 回答