即使我正确使用了阅读器,也已经有一个与此连接关联的打开的 DataReader

如何解决即使我正确使用了阅读器,也已经有一个与此连接关联的打开的 DataReader

我正试图弄清楚如何避免这个 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;在我的连接字符串中

这是获取sql连接的Conectar()方法

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?