在ASP.Net c#中执行多个读取器

3

我想在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();)。
这个问题有解决方案吗?谢谢。
1个回答

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;


我尝试过这样做,它消除了错误,但我的网格视图中没有显示任何数据。索引或查询是否存在某种问题? - Joe Law
有趣的是...如果你看一下这个答案 https://dev59.com/CXHYa4cB1Zd3GeqPPL99#16381518,OP说了同样的话。 OP被引导到这个博客 https://weblogs.asp.net/gurusarkar/binding-list-of-custom-class-to-gridview-or-listview-control 来设置GridView中的列。 - Philip Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接