Просто рассмотрите шаги вашей программы:
try
{
if (conn.State != ConnectionState.Open)
{
conn.Open();
dr = cmd.ExecuteReader();
}
}
Сначала вы правильно открыли соединение и выполнили команду - с этим все в порядке!
finally
{
dr.Dispose();
conn.Close();
}
Далее ваш код попадает в блок finally - вы (пытаетесь) избавиться от считывателя и закрыть соединение! Опять ничего плохого в этом нет.
Далее идет ваша проблема:
return dr;
...
textBox1.Text = dr[1].ToString();
Вы возвращаете закрытое устройство чтения, а затем пытаетесь прочитать его, что приводит к ошибке, которую вы получаете.
ИМХО мне на ум приходят два возможных решения:
- вернуть читателя, не закрывая его (отметьте этот вопрос )
- кэширует результат чтения и возвращает его (в вашем случае строка для текстового поля)