2013-06-28 3 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 два раза? One достаточно

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 Injection - проблема всегда со мной .... Еще раз спасибо 4 обучения !! – user72

0

Вы уже открыли читателя в строке выше. Я думаю, что вы хотите:

SqlDataReader dr = cmdr.ExecuteReader(); 

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

Но есть и другие вопросы - SQL Injection, как M @ Брэд указывает (сделать поиск на параметризованных запросов), и вы протечки ваши объекты команд - они должны быть заключены в using statements.

Я также немного нервничаю в отношении того, что/где определено con - он сильно пахнет как глобальная переменная. Общая схема использования ADO.Net заключается в том, что внутри одного метода/блока кода вы должны создать новый объект SqlConnection (внутри оператора using), создать новый объект SqlCommand (внутри оператора using), открыть соединение, выполнить команду, обработать результаты (если применимо), а затем выйти из блоков using и позволить всем очиститься. Не пытайтесь обмениваться объектами SqlConnection.

0

вы уже казнить читатель

SqlDataReader dr = cmdr.ExecuteReader(); 

Так if, вы должны использовать существующий читатель

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