2016-05-12 67 views
0

データベースからの結果をドロップダウンリストに取り込む関数(PopulateStudents)があります。この関数は、2つの異なる機会に呼び出されます。idを持つクエリ文字列が指定されたとき、およびonselectedindexchangedイベントで呼び出されたとき。基本的に、URLからIDが提供された場合は、semesterIDとcourseIDを含む学生IDのデータベースレコードを取得します。次に、studentIDに基づいてすべてのDDLが作成されます。ASP C#リーダーが閉じられたときにFieldCountを呼び出す呼び出しが無効です

URLにIDがない場合、ユーザーはDDLから学期を選択します。コースDDLは、学期のDDLで選択された学期IDに基づいて入力されます。次に、選択したコースに基づいて生徒DDLが作成されます。

問題は、クエリ文字列にIDが指定されておらず、ユーザーが学期を選択してコースを選択する必要がある場合、PopulateStudent関数が正常に機能することです。クエリ文字列でIDが指定されると、PopulateStudents関数は機能しません。この関数は、Invalid attempt to call FieldCount when reader is closed.というエラーをスローします。私のコードに何が問題なのですか?ここで

aspx.csファイルされる:

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

ここでは、ASPです。お時間を

<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 /> 

感謝。

+1

接続は、usingステートメントの範囲内でのみ作成してください。あなたのコードを簡略化することによって少し助けてくれるはずです。同じことが適用されます。(var conn = new SqlConnection(connString){'任意のReaderオブジェクトとSqlCommandsに渡すことができます。基本的に、ここでusingステートメントを使用できる場所はどこですか? – ManoDestra

答えて

0

私が気付かなかったPopulateCourses関数とPopulateStudents関数の間​​には、実際には1つの違いがありました。コースでは、私はDDCourse.DataBind()を使用し、学生はthis.DataBind()を使用しました。

populatestudents関数でthis.DataBind()をDDStudent.DataBind()に変更すると、私の問題が修正されました。

関連する問題