2016-05-12 4 views
0

Ich habe eine Funktion (PopulateStudents), die eine Dropdownliste mit Ergebnissen aus einer Datenbank auffüllt. Diese Funktion wird zu zwei verschiedenen Anlässen aufgerufen: Wenn eine Abfragezeichenfolge mit ID angegeben wird, und in einem Ereignis onselectedindexchanged. Grundsätzlich, wenn eine ID von der URL zur Verfügung gestellt wird, dann erhalten Sie eine Datenbank-Datensatz von einem Studenten ID, die SemesterID und Kurs-ID enthält. Anschließend werden alle DDLs anhand der studentID aufgefüllt.ASP C# Ungültiger Versuch, FieldCount aufzurufen, wenn der Reader geschlossen ist

Wenn in der URL keine ID vorhanden ist, wählt der Benutzer ein Semester aus einer DDL aus. Dann wird der Kurs DDL anhand der im Semester DDL ausgewählten Semester-ID ausgefüllt. Dann wird die Studenten-DDL basierend auf dem ausgewählten Kurs ausgefüllt.

Das Problem ist, dass die PopulateStudent-Funktion ordnungsgemäß funktioniert, wenn keine ID in der Abfragezeichenfolge angegeben ist und der Benutzer das Semester und dann den Kurs auswählen muss. Wenn die ID in der Abfragezeichenfolge angegeben wird, funktioniert die Funktion PopulateStudents nicht. Die Funktion löst einen Fehler aus, der besagt: Invalid attempt to call FieldCount when reader is closed. Was ist falsch an meinem Code? Hier

ist die aspx.cs Datei:

protected void Page_Load(object sender, EventArgs e) 
     { 

      if (!IsPostBack) 
      { 
       if (Request.QueryString["id"] != null) 
       { 
        GetStudentScores(Convert.ToInt32(Request.QueryString["id"])); 

        string connString; 
        connString = RetrieveConnectionString(); 

        SqlConnection conn = new SqlConnection(connString); 

        try 
        { 
         using (conn) 
         { 
          conn.Open(); 
          SqlCommand cmd = new SqlCommand("dbo.GetEnrolleeDetails", conn); 
          cmd.Parameters.Add("@enrollmentID", System.Data.SqlDbType.Int); 
          cmd.Parameters["@enrollmentID"].Value = Convert.ToInt32(Request.QueryString["id"]); 

          cmd.CommandType = System.Data.CommandType.StoredProcedure; 

          SqlDataReader reader = cmd.ExecuteReader(); 
          reader.Read(); 

          int semesterID = Convert.ToInt32(reader["semesterId"]); 
          int courseID = Convert.ToInt32(reader["courseId"]); 

          PopulateCourses(semesterID); 
          PopulateStudents(courseID); 

          DDSemester.SelectedValue = Convert.ToString(semesterID); 
          DDCourse.SelectedValue = Convert.ToString(courseID); 
          DDStudent.SelectedValue = Request.QueryString["ID"]; 
         } 
        } 
        catch (Exception err) 
        { 
         lblStatus.Text = err.Message; 
        } 
        finally 
        { 
         conn.Close(); 
         conn.Dispose(); 
        } 
       } 
      } 
     } 

     protected void DDCourse_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (IsPostBack) 
      { 
       PopulateStudents(Convert.ToInt32(DDCourse.SelectedValue)); 
      } 
     } 



     protected void DDStudent_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (IsPostBack) 
      { 
       GetStudentScores(Convert.ToInt32(DDStudent.SelectedValue)); 
      } 
     } 

     protected void DDSemester_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (IsPostBack) 
      { 
       PopulateCourses(Convert.ToInt32(DDSemester.SelectedValue)); 
      } 
     } 

     private void PopulateCourses(int semesterID) 
     { 
      string connString; 
      connString = RetrieveConnectionString(); 

      SqlConnection conn = new SqlConnection(connString); 

      try 
      { 
       using (conn) 
       { 
        conn.Open(); 
        SqlCommand cmd = new SqlCommand("dbo.GetSemesterCourses", conn); 
        cmd.Parameters.Add("@semesterID", System.Data.SqlDbType.Int); 
        cmd.Parameters["@semesterID"].Value = semesterID; 

        cmd.CommandType = System.Data.CommandType.StoredProcedure; 

        DDCourse.DataSource = cmd.ExecuteReader(); 
        DDCourse.DataTextField = "courseName"; 
        DDCourse.DataValueField = "courseId"; 
        DDCourse.DataBind(); 
       } 
      } 
      catch (Exception err) 
      { 
       lblStatus.Text = err.Message; 
      } 
      finally 
      { 
       conn.Close(); 
       conn.Dispose(); 
      } 
     } 

     private void PopulateStudents(int courseID) 
     { 
      string connString; 
      connString = RetrieveConnectionString(); 

      SqlConnection conn = new SqlConnection(connString); 

      try 
      { 
       using (conn) 
       { 
        conn.Open(); 
        SqlCommand cmd = new SqlCommand("dbo.CourseEnrollment", conn); 
        cmd.Parameters.Add("@courseId", System.Data.SqlDbType.Int); 
        cmd.Parameters["@courseId"].Value = courseID; 

        cmd.CommandType = System.Data.CommandType.StoredProcedure; 

        DDStudent.DataSource = cmd.ExecuteReader(); 
        DDStudent.DataTextField = "fullName"; 
        DDStudent.DataValueField = "enrollmentId"; 
        this.DataBind(); 
       } 
      } 
      catch (Exception err) 
      { 
       lblStatus.Text = err.Message; 
      } 
      finally 
      { 
       conn.Close(); 
       conn.Dispose(); 
      } 
     } 

Hier ist die asp ist:

<asp:Label ID="Label1" runat="server" Text="Semester:"></asp:Label> 
    <asp:DropDownList ID="DDSemester" runat="server" AutoPostBack="True" AppendDataBoundItems="true" DataSourceID="SqlDataSource1" DataTextField="semesterName" DataValueField="semesterId" OnSelectedIndexChanged="DDSemester_SelectedIndexChanged">  
       <asp:ListItem Text="Select a Semester"></asp:ListItem> 
    </asp:DropDownList><br /> 

    <asp:Label ID="Label15" runat="server" Text="Course:"></asp:Label> 
    <asp:DropDownList ID="DDCourse" runat="server" AutoPostBack="True" AppendDataBoundItems="true" OnSelectedIndexChanged="DDCourse_SelectedIndexChanged"> 
     <asp:ListItem Text="Select a Course"></asp:ListItem> 
    </asp:DropDownList><br /> 

    <asp:Label ID="Label16" runat="server" Text="Student"></asp:Label> 
    <asp:DropDownList ID="DDStudent" runat="server" AutoPostBack="true" AppendDataBoundItems="true" OnSelectedIndexChanged="DDStudent_SelectedIndexChanged"> 
     <asp:ListItem Text="Select a Student"></asp:ListItem> 
    </asp:DropDownList><br /> 

Vielen Dank für Ihre Zeit.

+1

Sie sollten Ihre Verbindungen nur im Rahmen der using-Anweisung erstellen, z. 'using (var conn = new SqlConnection (connString) {'. Auf diese Weise brauchen Sie keine der manuellen close/dispose-Aufrufe. Ist vielleicht nicht die Lösung, aber es sollte ein wenig helfen, indem Sie Ihren Code vereinfachen zu irgendwelchen Reader-Objekten und SqlCommands. Grundsätzlich, wo immer du hier eine using-Anweisung verwenden kannst, tu dies :) – ManoDestra

Antwort

0

Es gab tatsächlich einen Unterschied zwischen den Funktionen PopulateCourses und PopulateStudents, die ich nicht bemerkt habe. In Kursen verwendete ich DDCourse.DataBind() und in Studenten verwendete ich.DataBind().

In der populatstudents -Funktion, dieses Problem zu beheben.DataBind() zu DDStudent.DataBind() behoben.

Verwandte Themen