问题描述
我正试图弄清楚如何避免这个 DataReader 问题,由于某种原因,在我的代码中总是有一些代码运行 DataReader 的东西,它一直试图立即完成所有事情,而不是等待读者完成,因为我是使用 'using' 关键字,所以,这是我想要做的:
[HttpPost]
public ActionResult AlteraAnimal(Animal model)
{
Cliente _Cliente = new Cliente(AppUser.IdFirebase);
Animal _Animal = new Animal();
_Animal = model;
if (ModelState.IsValid)
{
_Animal.idCliente = Cliente.IdCliente;
int result = _Animal.Altera(_Animal);
if (result > 0)
{
TempData["Resultado"] = result;
TempData["Status"] = "AlteraçãoSucesso";
_Cliente.CarregarDados(Cliente.IdFirebase);
}
ViewBag.Title = "Animais";
return View("Animais",_Cliente);
}
TempData["Status"] = "Erro";
ViewBag.Title = "Animais";
return View("Animais",_Cliente);
}
这是发生异常的地方: ( system.invalidOperationException: '已经有一个与此连接关联的打开的 DataReader 必须先关闭。')
public int AlteraAgendamento(Agendamento _Agendamento)
{
try
{
int result = 0;
if (Checadisponibilidade(_Agendamento.DataHoraInicio) == 1)
{
_Connection = Conectar();
StringBuilder sb = new StringBuilder();
sb.Append("UPDATE Agendamento SET " +
"IdAnimal=@IdAnimal," +
"DataHoraInicio=@DataHoraInicio," +
"DataHoraFim=@DataHoraFim " +
"WHERE IdAgendamento = @IdAgendamento ");
String sql = sb.ToString();
using (_Connection)
{
using (sqlCommand _Command = new sqlCommand(sql,_Connection))
{
_Command.Parameters.Add(new sqlParameter("@IdAnimal",sqlDbType.Int) { Value = _Agendamento.IdAnimal });
_Command.Parameters.Add(new sqlParameter("@DataHoraInicio",sqlDbType.DateTime) { Value = _Agendamento.DataHoraInicio });
_Command.Parameters.Add(new sqlParameter("@DataHoraFim",sqlDbType.DateTime) { Value = _Agendamento.DataHoraInicio.AddMinutes(30) });
_Command.Parameters.Add(new sqlParameter("@IdAgendamento",sqlDbType.Int) { Value = _Agendamento.IdAgendamento });
result = _Command.ExecuteNonQuery();
}
}
AlteraAgendamentoServico(_Agendamento);
return result;
}
else
{
result = 2;
}
_Agendamento.MsgStatus = "HorarioIndisponivel";
return result;
}
catch (Exception e)
{
throw e;
}
}
出于某种原因,根据 Visual Studio,这是 Reader 所在的位置,但我认为通过使用 'using' 关键字,读者可以毫无问题地关闭自己,也许他们正在同时执行,我应该等待让他们在做任何事情之前完成使用阅读器?
public string GetDescricaoTipoAnimal(int idRaca)
{
try
{
var _Table = new DataTable();
_Connection = Conectar();
StringBuilder sb = new StringBuilder();
sb.Append("SELECT " +
"IdRaca," +
"IdTipoAnimal " +
"FROM Raca " +
"WHERE " +
"IdRaca = " + "@IdRaca");
String sql = sb.ToString();
using (_Connection)
{
using (sqlCommand _Command = new sqlCommand(sql,_Connection))
{
_Command.Parameters.Add(new sqlParameter("@IdRaca",sqlDbType.Int) { Value = idRaca });
sqlDataReader reader;
using (reader = _Command.ExecuteReader()) //THIS IS THE READER CAUSING EXCEPTION
{
_Table.Load(reader);
}
}
}
foreach (DaTarow _RowAnimais in _Table.Rows)
{
idTipoAnimal = Convert.ToInt32(_RowAnimais.ItemArray[1]);
}
sb = new StringBuilder();
sb.Append("SELECT " +
"IdTipoAnimal," +
"Descricao " +
"FROM TipoAnimal " +
"WHERE " +
"IdTipoAnimal = " + idTipoAnimal);
sql = sb.ToString();
_Table = new DataTable();
_Connection = Conectar();
using (_Connection)
{
using (sqlCommand _Command = new sqlCommand(sql,_Connection))
{
sqlDataReader reader;
using (reader = _Command.ExecuteReader())
{
_Table.Load(reader);
}
}
}
foreach (DaTarow _RowAnimais in _Table.Rows)
{
descricaoTipoAnimal = Convert.ToString(_RowAnimais.ItemArray[1]);
}
}
catch (Exception e)
{
throw e;
}
return descricaoTipoAnimal;
}
我也是 StackOverflow 的新手,所以如果这不是最好的格式,请原谅我,感谢任何帮助,如果有人需要更多信息,请随时问我,我会更新我的问题。
谢谢!
--- 编辑---
我正在使用 MultipleActiveResultSets=True;在我的连接字符串中
public static sqlConnection Conectar()
{
if (_Conexao.State != ConnectionState.Open)
{
try
{
if (ConnectionString != null && ConnectionString != string.Empty)
{
_Conexao = new sqlConnection(ConnectionString);
_Conexao.open();
}
else
throw new Exception("String de conexão inexistente");
}
catch (Exception _Ex)
{
throw new Exception("Banco de Dados Indisponível. " + Environment.NewLine + _Ex.Message);
}
}
return _Conexao;
}
这是我将数据发布到控制器的表单
<form asp-action="AlteraAnimal" asp-controller="Animais" method="post" id="formAlteracaoAnimal">
<div class="form-group">
<select hidden asp-for="idAnimal" class="form-control" id="idAnimalSelectAlteracao">
<option value="@Model.idAnimal"></option>
</select>
</div>
<div class="form-group">
<label for="nomeAnimalInputAlteracao">Nome do animal</label>
<input asp-for="nome" type="text" class="form-control" id="nomeAnimalInputAlteracao" placeholder="Digite o nome do animal">
<span asp-validation-for="nome" class="text-danger"></span>
</div>
<div class="form-group">
<label for="SexoSelectAlteracao">Sexo</label>
<select asp-for="sexo" class="form-control" id="SexoSelectAlteracao">
<option value="1">Macho</option>
<option value="2">Fêmea</option>
<option value="3">Indefinido</option>
</select>
<span asp-validation-for="sexo" class="text-danger"></span>
</div>
<div class="form-group">
<label for="datanascimentoSelectAlteracao">Data de nascimento:</label>
<input asp-for="datanascimento" type="datetime-local" id="datanascimentoSelectAlteracao">
</div>
<div class="form-group">
<label for="textCorAlteracao">Informe a cor do animal:</label>
<textarea asp-for="cor" class="form-control" id="textCorAlteracao" rows="1"></textarea>
<span asp-validation-for="cor" class="text-danger"></span>
</div>
<div class="form-group">
<label for="tipoAnimalAlteracao">Selecione o tipo de animal:</label>
<select asp-for="tipo" class="form-control" id="tipoAnimalAlteracao">
<option value="@Model.idTipoAnimal">@Model.descricaoTipoAnimal</option>
@foreach (TipoAnimal _TipoAnimal in Model.listaTipoAnimal)
{
if (Model.idTipoAnimal != _TipoAnimal.IdTipoAnimal)
{
<option value="@_TipoAnimal.IdTipoAnimal">@Html.displayFor(modelItem => _TipoAnimal.Descricao)</option>
}
}
</select>
<span asp-validation-for="tipo" class="text-danger"></span>
</div>
<div class="form-group">
<label for="racaAnimalAlteracao">Raça do animal</label>
<select asp-for="raca" class="form-control" id="racaAnimalAlteracao">
<option value="@Model.raca">@Model.raca</option>
</select>
<span asp-validation-for="raca" class="text-danger"></span>
</div>
<div class="form-group">
<select asp-for="idRaca" class="form-control" id="idRacaAnimalAlteracao" hidden>
</select>
</div>
<div class="form-group">
<label for="obsAdicionalAlteracao">Observações adicionais:</label>
<textarea asp-for="observacao" class="form-control" id="obsAdicionalAlteracao" rows="3"></textarea>
</div>
<div class="form-check-inline">
<label class="form-check-label">
<input asp-for="casTrado" id="checkCasTradoAlteracao" type="checkBox" class="form-check-input">CasTrado
</label>
</div>
<button type="submit" hidden id="submitAlteracaoHidden"></button>
</form>
另外,我发现您可能还需要 Checadisponibilidade() 代码,因为它是在 AlteraAgendamento() 内部调用的
public int Checadisponibilidade(DateTime DataInicio)
{
if(DataInicio < DateTime.Now)
{
return 0;
}
try
{
int result = 0;
int cont = 0;
var _Table = new DataTable();
_Connection = Conectar();
StringBuilder sb = new StringBuilder();
sb.Append("SELECT " +
"IdAgendamento," +
"Codigo," +
"IdCliente," +
"IdAnimal," +
"DataCadastro," +
"IdUsuarioCadastro," +
"DataHoraInicio," +
"DataHoraFim," +
"Situacao," +
"Observacao," +
"Desabilitado," +
"DataDesabilitado," +
"IdUsuarioDesabilitado," +
"IdOrdemServico " +
"FROM Agendamento " +
"WHERE DataHoraFim BETWEEN @DataInicio AND @DataFim " +
"OR DataHoraInicio BETWEEN @DataInicio AND @DataFim");
String sql = sb.ToString();
using (_Connection)
{
using (sqlCommand _Command = new sqlCommand(sql,_Connection))
{
_Command.Parameters.Add(new sqlParameter("@DataInicio",sqlDbType.DateTime) { Value = DataInicio });
_Command.Parameters.Add(new sqlParameter("@DataFim",sqlDbType.DateTime) { Value = DataInicio.AddMinutes(30) });
sqlDataReader reader;
using (reader = _Command.ExecuteReader())
{
_Table.Load(reader);
}
cont = _Table.Rows.Count;
if (cont == 0)
{
//nao ha agendamentos no horario
result = 1;
return result;
}else
{
return result;
}
}
}
}
catch(Exception)
{
throw;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)