2017-04-08 3 views
0

Ich habe bereits mehrere Posts gelesen, die versucht haben, dieses Problem zu beheben, und keiner von ihnen funktioniert. Ich verwende bereits mehrere aktive Ergebnisse. Ich sorge dafür, die Leserverbindungen zu schließen. Ich verwende eine andere Verbindung. Ich verwende eindeutige Namen für den Leser, Datentabelle, den Leser, den Befehl ... Ich bin fest.Beim Füllen von Gridviews ist bereits ein Fehler beim Öffnen des Datenreaders aufgetreten.

Der Fehler ist: Zu diesem Befehl gehört bereits ein offener DataReader, der zuerst geschlossen werden muss.

Ich habe die Fehlerzeile mit "***** Fehler hier *****" markiert.

Code:

protected void gridviewsched_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    string nametime; 
    string name; 
    string time; 
    string initid; 
    string timeinitid = null; 
    GridView gridviewschedsub = (GridView)e.Row.FindControl("gridviewschedsub"); 
    GridView gridviewschedcplt = (GridView)e.Row.FindControl("gridviewschedcplt"); 

    using (SqlConnection con = new SqlConnection("Data Source=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\public website\\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True; MultipleActiveResultSets=True;")) 
    { 
     con.Open(); 
     DataTable dz = new DataTable(); 
     dz.Columns.Add("age"); 
     dz.Columns.Add("sex"); 
     dz.Columns.Add("address"); 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 

      string id = gridviewsched.DataKeys[e.Row.RowIndex].Value.ToString(); 
      using (var cmd = new SqlCommand("SELECT age,sex,address FROM precordTable WHERE Id='" + id + "'", con)) 
      { 
       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        //List<string> namedatelist = new List<string>(); 
        while (reader.Read()) 
        { 
         DataRow dr = dz.NewRow(); 
         dr["age"] = reader[0].ToString(); 
         dr["sex"] = reader[1].ToString(); 
         dr["address"] = reader[2].ToString(); 
         dz.Rows.Add(dr); 
        } 
        reader.Close(); 
       } 
       gridviewschedsub.DataSource = dz; 
       gridviewschedsub.DataBind(); 
       con.Close(); 
      } 
      using (var cmd3 = new SqlCommand("SELECT name, initid FROM precordTable WHERE Id='" + id + "'", con)) 
      { 
       con.Open(); 
       using (SqlDataReader reader = cmd3.ExecuteReader()) 
       { 

        List<string> namedatelist = new List<string>(); 
        while (reader.Read()) 
        { 
         name = reader["name"].ToString(); 
         initid = reader["initid"].ToString(); 
         time = DateTime.Now.ToString("MM-dd-yyyy"); 
         time = Regex.Replace(time, "[^0-9a-zA-Z]+", ""); 
         namedatelist.Add(name + time); 
         timeinitid = time + "$" + initid; 

        } 
        Session["timeinitid"] = timeinitid; 
        nametime = Regex.Replace(namedatelist[0].ToString(), "[^0-9a-zA-Z]+", ""); 
        reader.Close(); 
       } 

      } 
      var cmd2 = new SqlCommand("select case when exists((select * from [C:\\USERS\\PUBLIC\\PUBLIC WEBSITE\\SLDATABASE.MDF].INFORMATION_SCHEMA.tables where table_name = 'D" + timeinitid + "ou')) then 1 else 0 end", con); 

      if ((int)cmd2.ExecuteScalar() == 1) 
      { 

       string fQuery = "select item, scheduled from D" + timeinitid + "ou where 0 = 1"; 
       string pQuery = "select item, scheduled from D" + timeinitid + "ou where initialed = '' and prescdr IS NULL and item != '';"; 
       SqlDataAdapter sdyn = new SqlDataAdapter(); 
       DataTable cpltTable = new DataTable(); 

       cpltTable = GetData(pQuery); 

       gridviewschedcplt.DataSource = cpltTable; 
       gridviewschedcplt.DataBind(); 
       con.Close(); 
      } 
      else 
      { 

       return; 
      } 



     } 
    } 
    for (int j = 0; j < gridviewsched.Rows.Count; j++) 
    { 
     for (int i = 3; i < 9; i++) 
     { 
      gridviewsched.Rows[j].Cells[i].RowSpan = 2; 
     } 
     gridviewsched.Rows[j].Cells[2].RowSpan = 2; 
    } 
} 

private static DataTable GetData(string pQuery) 
{ 
    string schedtime; 
    string nowtime; 
    SqlDataAdapter sd1 = new SqlDataAdapter(); 
    DataTable dTable = new DataTable(); 
    using (SqlConnection conn = new SqlConnection("Data Source=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\public website\\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;MultipleActiveResultSets=True;")) 
    { 
     conn.Open(); 
     SqlCommand cmd33 = new SqlCommand(pQuery, conn); 
     using (SqlDataReader reader99 = cmd33.ExecuteReader()) 
     { 
      while (reader99.Read()) 
      { 
       sd1.SelectCommand = cmd33; 
       ***error here**** sd1.Fill(dTable); 
       DataRow newcpltTablerow = dTable.NewRow(); 
       newcpltTablerow["item"] = reader99["item"].ToString(); 
       dTable.Rows.Add(newcpltTablerow); 

      } 

      reader99.Close(); 
     } 

     return dTable; 
    } 


} 

Antwort

1

Sie brauchen keine SqlDataReader, wenn Sie einen SqldataAdapter verwenden. Sie erhalten den Fehler, weil Sie einen Leser innerhalb eines bereits geöffneten Adapters öffnen. Tun Sie dies statt (nicht kompiliert so zwicken nach Bedarf und ändern Sie die Abfrage zu verkaufen):

using (SqlConnection con = new SqlConnection(constring)) 
    { 
     using (SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", con)) 
     { 
      cmd.CommandType = CommandType.Text; 
      using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
      { 
       using (DataTable dt = new DataTable()) 
       { 
        sda.Fill(dt); 
        dataGridView1.DataSource = dt; 
       } 
      } 
     } 
    } 
+0

Wow, das war das Problem. Letztendlich habe ich den Adapter eliminiert. Ich habe nur ungefähr 1/3 des Codes in dieser Funktion gepostet und ich brauchte den Leser, um einige zusätzliche Operationen mit den Spalten durchzuführen. – anesthetic

0

cmd33.ExecuteReader kann nur einmal aufgerufen werden. Sie führen es für jede Zeile aus.

Verwandte Themen