遇到“DataReader已经打开”的问题

时间:2011-01-21 03:16:38

标签: c# asp.net-mvc linq datareader

我搜索了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   与此Connection相关联   必须先关闭

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

我看不出连接有任何问题,有人能告诉我出了什么问题吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

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

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();

答案 1 :(得分:0)

您可以通过ToList()强制评估您的实体。但是你也可以设置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