Неправильная попытка вызвать FieldCount, когда читатель закрыт - PullRequest
1 голос
/ 12 августа 2010

Ошибка выше возникает, когда я пытаюсь сделать dataReader.Read для данных, полученных из базы данных.Я знаю, что там есть две строки, так что это не так, потому что данные на самом деле не существуют.

Может ли это быть CommandBehavior.CloseConnection, вызывая проблему?Мне сказали, что вы должны были сделать это сразу после ExecuteReader?Это правильно?

        try
        {
            _connection.Open();
            using (_connection)
            {
                SqlCommand command = new SqlCommand("SELECT * FROM Structure", _connection);
                SqlDataReader dataReader = command.ExecuteReader(CommandBehavior.CloseConnection);

                if (dataReader == null) return null;

                var newData = new List<Structure>();
                while (dataReader.Read())
                {
                    var entity = new Structure
                    {
                        Id = (int)dataReader["StructureID"],
                        Path = (string)dataReader["Path"],
                        PathLevel = (string)dataReader["PathLevel"],
                        Description = (string)dataReader["Description"]
                    };

                    newData.Add(entity);
                }
                dataReader.Close();

                return newData;
            }
        }
        catch (SqlException ex)
        {
            AddError(new ErrorModel("An SqlException error has occured whilst trying to return descendants", ErrorHelper.ErrorTypes.Critical, ex));
            return null;
        }
        catch (Exception ex)
        {
            AddError(new ErrorModel("An error has occured whilst trying to return descendants", ErrorHelper.ErrorTypes.Critical, ex));
            return null;
        }
        finally
        {
            _connection.Close();
        }
    }

Заранее спасибо за любую помощь.

Клэр

Ответы [ 4 ]

1 голос
/ 15 апреля 2014

Когда вы используете Use in C #, после последнего} от использования, Connection автоматически закрывается, поэтому вы закрываете fieldcount, когда вы пытаетесь прочитать его, поскольку это невозможно, потому что вы хотите эти данные , затем прочтите перед тем, как закрыть использование, или вы можете вручную открыть и закрыть соединение, не используя (использование)

1 голос
/ 12 августа 2010

Ваш код, как отображается, в порядке.Я взял его в тестовый проект, и он работает.Не сразу понятно, почему вы получаете это сообщение с кодом, показанным выше.Вот несколько советов / предложений по отладке.Я надеюсь, что они ценны для вас.

  • Создайте точку останова на while (dataReader.Read()).Прежде чем он войдет в свой кодовый блок, введите его в своем окне немедленного просмотра или просмотра: dataReader.HasRows.Это должно принять значение true.

  • Пока остановлено на этом Read(), откройте окно Locals, чтобы проверить все свойства dataReader.Убедитесь, что FieldCount - это то, что вы ожидаете от своего оператора SELECT.

  • При входе в эту итерацию Read() создается ли объект ученика вообще?Каково значение dataReader["StructureID"] и всех остальных в «Немедленном окне»?

Это не CommandBehavior.CloseConnection, вызывающее проблему.Это просто говорит о том, что соединение также закрывается при закрытии хранилища данных.

0 голосов
/ 24 февраля 2019

Та же проблема здесь. Проверены все вышеперечисленные решения

  • увеличить время ожидания команды
  • закрыть соединение после прочтения

Вот код

    1 objCmd.Connection.Open()
    2 objCmd.CommandTimeout = 3000
    3 Dim objReader As OleDbDataReader = objCmd.ExecuteReader()
    4 repeater.DataSource = objReader
    5 CType(repeater, Control).DataBind()
    6 objReader.Close()
    7 objCmd.Connection.Dispose()

Более того, в строке 4 objReader имеет значение Closed = False

0 голосов
/ 12 июня 2014

Когда я получил эту ошибку, это была проблема тайм-аута команды (я читал некоторые большие двоичные данные).В качестве первой попытки я увеличил время ожидания команды (не время ожидания соединения!), И проблема была решена.Примечание: пытаясь выяснить проблему, я попытался прослушать событие StateChanged соединения (Sql), но оказалось, что соединение никогда не попадает в состояние «обрыв».

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