2017-02-14 2 views
0

В основном, когда я запускаю этот код, я получаю следующую ошибку, и я не знаю, как ее разрешить. Я получаю эту ошибку, когда я нажимаю кнопку, а затем перенаправляюсь обратно в Visual Studio со следующей ошибкой. Пожалуйста, помогите мне решить эту ошибку, помощь приветствуется.A {«Существует уже открытый DataReader, связанный с этой командой, который должен быть закрыт первым».}

Существует уже открытый DataReader, связанный с этой командой, который должен быть закрыт первым.

public partial class forgot : System.Web.UI.Page 
{ 
    protected void resetpass_Click(object sender, EventArgs e) 
    { 
     SqlDataReader reader = null; 

     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString); 
     con.Open(); 

     SqlCommand cmd = new SqlCommand("select * from reg where Username [email protected]", con); 
     cmd.Parameters.AddWithValue("@username", username.Text); 
     cmd.Parameters.AddWithValue("@security1", sec1.Text); 
     cmd.Parameters.AddWithValue("@security2", sec2.Text); 

     reader = cmd.ExecuteReader(); 

     if (reader != null && reader.HasRows) 
     { 
      newpass.Visible = true; 
      confpass.Visible = true; 
      Label1.Text = "New Password"; 
      Label2.Text = "Confirm New Password"; 

      SqlDataAdapter updates = new SqlDataAdapter("update reg set Password='" + newpass.Text + "'", con); 

      DataSet ds = new DataSet(); 
      updates.Fill(ds); 

      ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('The Password has been Changed')</script>"); 
      con.Close(); 
     } 
    } 
} 
+0

'Fill' метод автоматически' open' соединение, и до того, что вы должны 'Close' предыдущее соединение. –

+0

[Предупреждение SQL Injection] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - вы должны ** не ** объединить свои SQL-запросы - использовать ** параметризованные запросы ** вместо избежания SQL-инъекции –

+0

Почему вы редактируете свой код? –

ответ

0

В то время, когда вы пытаетесь запустить Fill, соединение con уже занято, пытаясь извлечь данные, чтобы сохранить SqlDataReader счастливым. Соединение с базой данных может обрабатывать только один набор результатов за раз.

У вас есть два варианта:

  1. Initialize updates со вторым экземпляром соединения с базой данных, так что вам придется два открыто в то же время.
  2. Используйте reader, чтобы получить полный набор результатов первым, сохранив его в массиве или DataTable. Затем, когда вы закончите с читателем, выполните итерацию через массив/таблицу и выполните обновления для reg.
+0

, пожалуйста, отредактируйте код, пожалуйста, первым вариантом. – umrktk

+0

. Я попробовал ваш второй способ, чтобы ошибка исчезла, покупая, почему разрешает пользователю видео newpass.Visible = true; confpass.Visible = true; и т. д., когда оператор if не выполняется, потому что я хочу, чтобы username.text = имя пользователя, вопросы безопасности были равны вопросам безопасности базы данных. когда эти условия выполняются, тогда он должен отображать содержимое в выражении if – umrktk

1

Вы получаете эту ошибку, потому что у вас есть вложенные читатели данных. Вот ваш код, упрощена, чтобы показать, что вы делаете:

protected void resetpass_Click(object sender, EventArgs e) { 
    // Here is data reader 
    SqlDataReader reader = null; 
    // ... 
    reader = cmd.ExecuteReader(); 
    if(reader != null && reader.HasRows) { 
     // ... 
     // and here is another one within the above data reader 
     SqlDataAdapter updates = new SqlDataAdapter("update reg set Password='" + newpass.Text + "'", con); 
    } 
} 

Чтобы сделать это, вам нужно включить MARS. Вы можете сделать это в строке подключения:

Server=.\SQLEXPRESS;Database=master;Integrated Security=SSPI; 
    MultipleActiveResultSets=true; 

Конечно вы, что это всего лишь пример, вам нужно будет использовать свою собственную строку подключения.

1

ошибка говорит, что вы открыли DataReader и вы открыли еще SqlDataAdapter перед закрытием DataReader. Поэтому в .Net вам нужно закрыть первую команду, чтобы открыть новую команду.

изменить это:

if (reader != null && reader.HasRows) 
     { 
      newpass.Visible = true; 
      confpass.Visible = true; 
      Label1.Text = "New Password"; 
      Label2.Text = "Confirm New Password"; 
      SqlDataAdapter updates = new SqlDataAdapter("update reg set Password='" + newpass.Text + "'", con); 
      DataSet ds = new DataSet(); 
      updates.Fill(ds); 
      ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('The Password has been Changed')</script>"); 
      con.Close(); 
     } 

в

if (reader != null && reader.HasRows) 
     { 
      reader.Close(); 
      newpass.Visible = true; 
      confpass.Visible = true; 
      Label1.Text = "New Password"; 
      Label2.Text = "Confirm New Password"; 
      SqlDataAdapter updates = new SqlDataAdapter("update reg set Password='" + newpass.Text + "'", con); 
      DataSet ds = new DataSet(); 
      updates.Fill(ds); 
      ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('The Password has been Changed')</script>"); 
      con.Close(); 
     } 
Смежные вопросы

 Смежные вопросы