лучший способ загрузки больших данных из базы данных Mysql с использованием нескольких пользовательских контролей - PullRequest
0 голосов
/ 06 января 2019

Я нахожусь в этой ситуации: просмотреть изображение
на пустой панели расположены 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

1 Ответ

0 голосов
/ 07 января 2019

Ошибка, которую вы получаете, говорит о том, что вы уже открыли 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
}

или если вы открыли одно соединение, скажем, целый класс (как я думаю, что вы сделали там), просто не переносите SqlConnection con = new Sql.... внутрь using, но все, что делают другие, и у вас не возникнет проблем, ожидайте, не забудьте сделать connection.Close().

Я ВСЕГДА использую using для каждого компонента в соединении sql, и это не влияет на мою производительность.

Когда вы реорганизуете код таким способом, вы избавитесь от этой проблемы, но один совет - не загружать данные, когда кто-то открывает форму, так как вы загрузите ее 5 раз, и пользователь может использовать только один, но лучший метод создания, такой как RefreshData() внутри вашего UC и до того, как вы выполните yourUserControl.BringToFront();, вы также выполните yourUserControl.RefreshData(), и таким образом вы загрузите его только при необходимости, и у вас всегда будет свежий, плюс у вас будет простой способ обновления данных, если это необходимо где-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...