遇到“DataReader 已打开”的问题

Posted

技术标签:

【中文标题】遇到“DataReader 已打开”的问题【英文标题】:Having an issue with "DataReader already open" 【发布时间】:2011-01-21 03:16:38 【问题描述】:

我在 SO 上进行了搜索,但没有找到任何关于我遇到的问题的答案。

我做了一个 linq 从两个表和一个 ajax 调用中获取所有数据以获取新数据并在另一个下拉列表更改时填充我的下拉列表。

这是我目前所拥有的:

控制器

public ActionResult Index(int? page)

    vEntities db = new vEntities();

    var estados = (from e in db.estado
                   select e);

    var localidades = (from l in db.localidade
                       select l);

    ViewData["estados"] = new SelectList(estados, "cod", "descricao");
    ViewData["localidades"] = new SelectList(localidades, "id", "descricao");

    return View();


public ActionResult GetLocalidades(string codEstado)

    vEntities db = new vEntities();

    var info = (from l in db.localidade
                where l.cod_estado == codEstado
                select l);

    return Json(info);

查看

<%= html.DropDownList("estados", ViewData["estados"] as SelectList, String.Empty)%>
<%= Html.DropDownList("localidade", ViewData["localidades"] as SelectList, String.Empty)%>

<script type="text/javascript">
    $(document).ready(function () 
        $("#estados").change(function () 
            var ddlLocalidade = $("#localidade")[0];
            ddlLocalidade.length = 0;
            var cod = $(this).val();

            $.post(
                "/Home/GetLocalidades",
                 codEstado: cod ,
                function (data) 
                    var option;
                    $.each(data, function () 
                        option = new Option(this.descricao, this.id);
                        ddlLocalidade.options.add(option);
                    );
                
                );

        );
    );
</script>

当我更改激活 JS 功能的第一个下拉菜单时,我在方法“Getocalidades”返回 Json 后立即收到此错误:

已经有一个打开的 DataReader 与此连接相关联 必须先关闭

我想我在格式化代码时遇到了一些问题 :) 抱歉。

我看不出连接有什么问题,谁能告诉我出了什么问题?

提前致谢

【问题讨论】:

我不得不承认,我看不出有什么明显的错误。 【参考方案1】:

这只是一个猜测。但是如果你改变这些行会发生什么

var estados = (from e in db.estado select e);

var localidades = (from l in db.localidade select l);

var info = (from l in db.localidade where l.cod_estado == codEstado select l);

var estados = (from e in db.estado select e).ToList();

var localidades = (from l in db.localidade select l).ToList();

var info = (from l in db.localidade where l.cod_estado == codEstado select l).ToList();

【讨论】:

我做到了,但现在我遇到了另一个问题:“在返回 Json 之后,再次序列化 'Site.Models.estabelecimento' 类型的对象时检测到循环引用”。顺便说一句,“estabelecimento”类型不在返回上,为什么会发生这种情况?谢谢回复! 看看这个链接。 ***.com/questions/1153385/…可能对你有帮助 奇怪与否,它确实有效!发生了什么 ?只需要修改以返回一个新的 Json .. 谢谢!【参考方案2】:

您可以通过 ToList()'ing 来强制评估您的实体。但是你也可以设置 MultipleActiveResultSets=true;在您的连接字符串中。

ToList() 起作用的原因是它强制命令立即执行。 MultipleActiveResultSets 将允许多个命令存在于一个数据库连接上,即使它们都还没有完成执行。我所做的是使用以下代码将属性强制到我的连接字符串中。例如,

            case DatabaseType.ORACLE:
                _factory = OracleClientFactory.Instance;
                break;
            case DatabaseType.MSSQL:
                _factory = System.Data.SqlClient.SqlClientFactory.Instance;
                if(!_connectionString.Contains("MultipleActiveResultSets")) //helper contains method for string
                    _connectionString = _connectionString.TrimEnd(';') + ";MultipleActiveResultSets=true;";
                break;

请看这里: Entity Framework: There is already an open DataReader associated with this Command

【讨论】:

以上是关于遇到“DataReader 已打开”的问题的主要内容,如果未能解决你的问题,请参考以下文章

Vue中用props给data赋初始值遇到的问题解决

求助Django+vue项目时候遇到一个问题,table的data数据怎么更新

caffe_ssd create_data.sh 遇到的问题

使用 RestSharp 在 multipart/form-data POST 中包含文件时遇到问题

重现ssd遇到的问题

在 Core Data 中设置数字属性时遇到问题