Ошибка, которую вы получаете, говорит о том, что вы уже открыли 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()
, и таким образом вы загрузите его только при необходимости, и у вас всегда будет свежий, плюс у вас будет простой способ обновления данных, если это необходимо где-либо.