Возникла проблема с «DataReader уже открыт» - PullRequest
2 голосов
/ 21 января 2011

Я искал на 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, связанный с этим подключением, который долженсначала закройте

Я думаю, у меня возникли проблемы с форматированием кода :) извините за это.

Я не вижу проблем с соединением, может кто-нибудь сказать мнечто не так, пожалуйста?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Это всего лишь предположение.Но что произойдет, если вы измените эти строки

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();
0 голосов
/ 21 октября 2015

Вы можете форсировать оценку ваших сущностей, используя 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: с этой командой уже есть открытый DataReader, связанный с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...