Похоже, что Role.GetRoleByID
попытается повторно использовать соединение.
Параметры:
- Получите нужные данные из
SqlDataReader
в GetByID
, закройтеэтот читатель и затем вызов Role.GetRoleByID
(так что у вас есть только один активный читатель за один раз) - Включить несколько активных наборов результатов (MARS) - я не могу сказать, что у менялюбой опыт этого
- Заставьте каждый метод использовать отдельное соединение, чтобы уменьшить зависимости между методами.Обратите внимание, что пул соединений сделает открытие / закрытие достаточно дешевым.
Я бы выбрал первый вариант на вашем месте - или, возможно, последний.Я бы также использовал оператор using
для автоматического закрытия читателя:
private const string GetUserByIdSql =
"Select Name, Email, LastLogin, FK_Role_ID from Users where ID=@id";
public static Users GetByID(int ID, SqlConnection connection)
{
var sql = ;
Users user;
int roleId;
using (var command = new SqlCommand(GetUserByIdSql, connection))
{
command.Parameters.Add(new SqlParameter("id", ID));
using (var reader = command.ExecuteReader())
{
if (!reader.Read())
{
return null;
}
user = new Users
{
Name = reader.GetString(0),
Email = reader.GetString(1),
LastLogin = reader.GetString(2),
};
// Remember this so we can call GetRoleByID after closing the reader
roleID = reader.GetInt32(3);
}
}
user.Role = Role.GetRoleByID(roleID, connection);
return user;
}
В качестве четвертого варианта - почему бы просто не выполнить соединение, требуемое GetRoleByID
в существующем запросе?Это означало бы, что вам потребуется только одна поездка в базу данных.