使用多个用户控件从mysql数据库加载大数据的最佳方法

a11xaf1n  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(316)

我在这种情况下:查看图像
空面板中堆叠了5个用户控件。
我有一个垂直菜单,其中有几个按钮,当我点击一个按钮时,我使用: BringToFront() 为了展示它们。

private void Button1_Click(object sender, EventArgs e)
{
 tabRandom1.BringToFront();
}

每个 usercontrol 包含 datagridview ,和其他 elements 必须加载来自数据库的数据,但如果我单击 button1 ,只有 usercontrol1 被加载。
当我尝试时:

private async void UserControl1_Load(object sender, EventArgs e)
{
  this.DataGridView1.DataSource = await GetDataAsync();
}

我得到一个例外@er shoaib:

there is already an open DataReader associated with tis connection which must be closed first.

我正在寻找加载活动usercontrol元素的最佳方法

xvw2m8pv

xvw2m8pv1#

你得到的错误很明显是你已经打开了 DataReader .
不能打开多个 DataReader 在一个连接内。
为了使您与数据库通信的代码更加稳定,请用 using 它会自动处理如下对象:

using(SqlConnection con = new SqlConnection("..."))
{
    con.Open();
    using(SqlCommand cmd = new SqlCommand("...", con))
    {
        using(SqlDataReader dr = cmd.ExecuteReader())
        {
            while(dr.Read())
                // Do the things
        }
    }
    // Do not need close since connection will be disposed
}

或者,如果你打开了一个连接,比如说整个班级(就像我认为你在那里做的那样),只是不要 Package SqlConnection con = new Sql.... 内部 using 但是其他人做的每件事你都不会有问题,不要忘记去做 connection.Close() .
我总是用 using 对于sql连接中的每个组件,它不会影响我的性能。
当您以这种方式重新组织代码时,您将摆脱这个问题,但有一个建议是不要在有人打开窗体时加载数据,因为您将加载它5次,并且用户可能只使用一个但更好的创建方法,如 RefreshData() 在你进入uc之前 yourUserControl.BringToFront(); 你也是 yourUserControl.RefreshData() 通过这种方式,您将只在需要时加载它,而且您将始终拥有一个新的,而且您将有一个简单的方法来刷新数据,如果需要的话。

相关问题