2017-10-29 4 views
2

cはASP.Netで複数のリーダーを実行は..私は同じクエリが、1つの異なるパラメータとを書き込み、などのデータを結合しそう長い反復プロセスであるものをクリーンアップするためにC#で反復を使用しようとしています#

しかし、私は同じリーダーを使用することに問題があります。

これは、現時点では私のコードです:

private void bindData() 
{ 
    string cs = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
    using (SqlConnection connection = new SqlConnection(cs)) 
    { 
     connection.Open(); 

     string[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; 

     for (int i = 0; i < 7; i++) 
     { 
      SqlCommand command = new SqlCommand("SELECT Name AS 'Class Name', FirstName AS 'Instructor First Name', LastName AS 'Instructor Last Name', LessonDuration AS 'Lesson Duration (hrs)', LessonTime AS 'Lesson Start' FROM Lesson, Class, Instructor WHERE Lesson.ClassID = Class.ClassID AND Lesson.InstructorID = Instructor.InstructorID AND LessonDay = '@Day';", connection); 
      command.Parameters.AddWithValue("@Day", days[i]); 

      using(SqlDataReader dr = command.ExecuteReader()) 
      { 
       switch (days[i]) 
       { 
        case "Monday": 
         GridView1.DataSource = dr; 
         DataBind(); 
         break; 
        case "Tuesday": 
         GridView2.DataSource = dr; 
         DataBind(); 
         break; 
        case "Wednesday": 
         GridView3.DataSource = dr; 
         DataBind(); 
         break; 
        case "Thursday": 
         GridView4.DataSource = dr; 
         DataBind(); 
         break; 
        case "Friday": 
         GridView5.DataSource = dr; 
         DataBind(); 
         break; 
        case "Saturday": 
         GridView6.DataSource = dr; 
         DataBind(); 
         break; 
        case "Sunday": 
         GridView7.DataSource = dr; 
         DataBind(); 
         break; 
       } 
       dr.Close(); 

      } 


     } 
     connection.Close(); 
    } 
} 

あなたが見ることができるように、ポイントが週の別の日を表す別のグリッドビューに別のクエリをバインドすることです。

「無効なfieldcolsデータリーダーが閉じています」または「dr.close();が削除されている場合は「もう一度読む前に閉じてください」のいずれかのエラーが発生し続けます。

この問題を解決する方法はありますか?ありがとうございました。

答えて

0

switch文のすべてのケースで、親クラスのDataBind()メソッドを呼び出しています。このメソッドは、含まれるすべてのデータバインドされたコントロールのDataBind()メソッドを呼び出します。

したがって、すべてのGridViewのDataBind()メソッドは、曜日ごとに呼び出されます。毎回データリーダーを閉じると、もう一度メッセージを読む前に閉じてしまいます。読んでいない場合は、読み込まれていないデータが返されます。

DataBind()呼び出しをforループの外に移動するか、代わりにGridView [X] .DataBind()を呼び出してください。例えば

case "Monday": GridView1.DataSource = dr; GridView1.DataBind(); break; case "Tuesday": GridView2.DataSource = dr; GridView2.DataBind(); break;

+0

私はこれをやってみました、それはエラーが削除されますが、データは私のgridviewsにまで見られませんでした。インデックスやクエリに何らかの問題がありますか? –

+0

興味深い...あなたがこの答えを見ているなら、https://stackoverflow.com/a/16381518/395675にOPは同じことを言います。 OPはこのブログのhttps://weblogs.asp.net/gurusarkar/binding-list-of-custom-class-to-gridview-or-listview-controlにリンクされ、GridViewの列を設定します –

関連する問題