2016-06-08 3 views
0

У меня возникла проблема при установке многих команд в том же открытом соединении, он всегда говорит, что есть DataReader, связанный с командой, которая должна быть закрыты, хотя я закрыл все еще дают мне такую ​​же проблему, это мой код:Ошибка: уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым

protected void Afficher_click(object sender, EventArgs e) 
    { 
     using (SqlConnection con = new SqlConnection(cs)) 
     { 
      SqlCommand cmd = new SqlCommand("select * from Consommation where idAbonnement = @ab and periode between @d1 and @d2 ",con); 
      cmd.Parameters.AddWithValue("@ab", DropDownList1.SelectedValue); 
      cmd.Parameters.AddWithValue("d1", TextBox1.Text); 
      cmd.Parameters.AddWithValue("d2", TextBox2.Text); 
      con.Open(); 
      GridView1.DataSource = cmd.ExecuteReader(); 
      GridView1.DataBind(); 
      //cmd.ExecuteReader().Close(); 
      cmd = new SqlCommand("select SUM(Qte) from Consommation where idAbonnement =" + DropDownList1.SelectedValue, con); 
      Label2.Text = cmd.ExecuteScalar().ToString(); 
      cmd = new SqlCommand("select AVG(Qte) from Consommation where idAbonnement =" + DropDownList1.SelectedValue, con); 
      Label4.Text = cmd.ExecuteScalar().ToString(); 
     } 

Можете ли вы объяснить мне, что проблема именно и как это исправить? Спасибо.

+0

В соответствии с https://msdn.microsoft.com/en-us/library/haa3afyz (v = vs.110) .aspx говорит, что «Обратите внимание, что, хотя DataReader открыт, соединение используется исключительно этим DataReader. Вы не можете выполнять какие-либо команды для соединения, включая создание другого DataReader, пока исходный DataReader не будет закрыто." поэтому вам нужно закрыть читателя - например, прокомментированную строку – BugFinder

+0

@BugFinder Я попробовал и закрыл Reader, он продолжал давать ту же ошибку, поэтому я прокомментировал это. –

+0

Какая строка на самом деле дает ошибку второй sql-оператор или третий? если вы сохранили закрытие, это, вероятно, изменится на 3-е Im guessing – BugFinder

ответ

0

попробуйте использовать другое имя для 2-й команды:

using (SqlConnection con = new SqlConnection(cs)) 
     { 
      SqlCommand cmd = new SqlCommand("select * from Consommation where idAbonnement = @ab and periode between @d1 and @d2 ",con); 
      cmd.Parameters.AddWithValue("@ab", DropDownList1.SelectedValue); 
      cmd.Parameters.AddWithValue("d1", TextBox1.Text); 
      cmd.Parameters.AddWithValue("d2", TextBox2.Text); 
      con.Open(); 
      GridView1.DataSource = cmd.ExecuteReader(); 
      GridView1.DataBind(); 
      cmd.Dispose(); 
      SqlCommand cmd2 = new SqlCommand("select SUM(Qte) from Consommation where idAbonnement =" + DropDownList1.SelectedValue, con); 
      Label2.Text = cmd2.ExecuteScalar().ToString(); 
      SqlCommand cmd3 = new SqlCommand("select AVG(Qte) from Consommation where idAbonnement =" + DropDownList1.SelectedValue, con); 
      Label4.Text = cmd3.ExecuteScalar().ToString(); 
     } 

Кроме того, очень важно: использовать параметры, вы подвергаетесь SQL Injection

+0

Пробовал это уже, но Он всегда дает то же Исключение. –

1

Вы должны закрыть SqlDataReader. Лучший способ в данном случае заключается в использовании:

GridView1.DataSource = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 

или использовать другой подход, например, с SqlDataAdapter и DataTable:

string sql = "select * from Consommation " + 
      "where idAbonnement = @ab " + 
      "and periode between @d1 and @d2 "; 
using (SqlConnection con = new SqlConnection(cs)) 
using (SqlDataAdapter da = new SqlDataAdapter(sql, con)) 
{ 
    con.Open(); 
    var cmd = da.SelectCommand; 
    cmd.Parameters.AddWithValue("@ab", DropDownList1.SelectedValue); 
    cmd.Parameters.AddWithValue("d1", TextBox1.Text); 
    cmd.Parameters.AddWithValue("d2", TextBox2.Text); 
    DataTable dataSource = new DataTable(); 
    da.Fill(dataSource); 
    GridView1.DataSource = dataSource; 
    GridView1.DataBind(); 

    using (var cmdSumQte = new SqlCommand(
     "select SUM(Qte) from Consommation where idAbonnement = @idAbonnement", con)) 
    { 
     cmdSumQte.Parameters.Add("@idAbonnement", SqlDbType.Int).Value = 
      int.Parse(DropDownList1.SelectedValue); 
     Label2.Text = cmdSumQte.ExecuteScalar().ToString(); 
    } 

    using(var cmdAvgQte = new SqlCommand(
      "select AVG(Qte) from Consommation where idAbonnement = @idAbonnement", con)) 
    { 
     cmdAvgQte.Parameters.Add("@idAbonnement", SqlDbType.Int).Value = 
      int.Parse(DropDownList1.SelectedValue); 
     Label4.Text = cmdAvgQte.ExecuteScalar().ToString(); 
    } 
} 

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

0
protected void Afficher_click(object sender, EventArgs e) 
    { 
     using (SqlConnection con = new SqlConnection(cs)) 
     { 
      SqlCommand cmd = new SqlCommand("select * from Consommation where idAbonnement = @ab and periode between @d1 and @d2 ",con); 
      cmd.Parameters.AddWithValue("@ab", DropDownList1.SelectedValue); 
      cmd.Parameters.AddWithValue("d1", TextBox1.Text); 
      cmd.Parameters.AddWithValue("d2", TextBox2.Text); 
      con.Open(); 
      GridView1.DataSource = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 
      GridView1.DataBind(); 
      cmd.Dispose(); 
      cmd = null; 
      cmd = new SqlCommand("select SUM(Qte) from Consommation where idAbonnement =" + DropDownList1.SelectedValue, con); 
      Label2.Text = cmd.ExecuteScalar().ToString(); 
      cmd = new SqlCommand("select AVG(Qte) from Consommation where idAbonnement =" + DropDownList1.SelectedValue, con); 
      Label4.Text = cmd.ExecuteScalar().ToString(); 
     } 
0

Поскольку вы используете несколько наборов результатов, вам необходимо добавить формулировку ниже

MultipleActiveResultSets = истина;

в вашем соединенииstring.

Для ех,

Server = myServerAddress;. Database = MyDatabase; Trusted_Connection = True; MultipleActiveResultSets = true;

+0

Я попробовал, но он дает эту ошибку: Недопустимое значение для ключевой «интегрированной безопасности». на странице «Аутентификация». (Я НАСТОЯЩИМ РЕШЕНИЕ ВСПОМОГАТЕЛЬНО) –

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

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