Ответ 1
Это может быть вызвано тем, что ваше соединение не открывается, потому что когда этот код вызывается:
if (_conn.State == ConnectionState.Closed)
_conn.Open();
Состояние соединения может быть: Broken
, или Connecting
или Fetching
(см. Список перечислений).
Это может произойти, если вы попытаетесь поделиться своим соединением между многими потоками. Я думаю, вам нужно создавать новое соединение каждый раз при вызове этого метода. Вы можете найти множество примеров, как это сделать, включая MSDN.
EDIT:
Для такого вопроса есть отличный ответ: ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения - "Подключение".
Но если вы действительно нуждаетесь в этом, попробуйте предотвратить использование одного и того же соединения с двумя или более потоками с помощью lock
(на самом деле это неправильно, см. Ссылку выше):
lock(_conn)
{
DataTable dt = new DataTable();
using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand))
{
sqlDataAdapter.Fill(dt);
}
}