c# - 使用多个用户控件从 Mysql 数据库加载大数据的最佳方法

标签 c# mysql .net winforms user-controls

我处于这种情况:view image
空面板中堆叠了 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();
}

我得到一个异常(exception)@er-shoaib:

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

我正在寻找加载事件用户控件元素的最佳方式

最佳答案

您收到的错误清楚地表明您已经打开了 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
}

或者如果你为整个类(class)打开了一个连接(就像我想你在那里做的那样)只是不要将 SqlConnection con = new Sql.... 包装在 using 但其他人所做的一切你不会有任何问题期望不要忘记做 connection.Close()

我总是对 sql 连接中的每个组件使用 using,这不会影响我的性能。

当您以这种方式重新组织代码时,您将摆脱这个问题,但一个建议是不要在有人打开表单时加载数据,因为您将加载它 5 次,用户可能只使用一个但更好的创建方法,如 RefreshData() 在您的 UC 中,在您执行 yourUserControl.BringToFront(); 之前,您还执行 yourUserControl.RefreshData() 这样您将只加载它如果需要,您将始终拥有新鲜的数据,而且如果需要,您还可以通过简单的方法在任何地方刷新数据。

关于c# - 使用多个用户控件从 Mysql 数据库加载大数据的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54063804/

相关文章:

c# - 为什么我的 python TCP 服务器需要绑定(bind)到 0.0.0.0 而不是本地主机或其 IP 地址?

mysql - Apache CloudStack 与 MySQL Cluster(NDB 引擎)

c# - 配置在 Hangfire 上每 15 分钟执行一次的 cron 作业

c# - 我在这个项目上过度扩张了吗?

c# - .NET 和 MySQL 中 SHA1 的区别

c# - 如何在其所有者进程退出时删除要删除的 DLL?

c# - 为什么 regasm.exe 使用错误的 GUID 注册我的 C# 程序集?

c# - Hangfire:延迟调用方法不起作用

c# - 内存不足异常 : using DbContext in Task

php - 将人们在 Flash 游戏上的进度保存到网站上