阅读器关闭时调用 FieldCount 的尝试无效

Cla*_*ear 6 datareader executereader

当我尝试对从数据库收到的数据执行 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

预先感谢您的任何帮助。

克莱尔

p.c*_*ell 2

您的代码,如图所示,没有问题。我已将其纳入测试项目,并且有效。目前尚不清楚为什么您会通过上面显示的代码收到此消息。以下是一些调试技巧/建议。我希望它们对您有价值。

  • 在 上创建一个断点while (dataReader.Read())。在进入代码块之前,请在“立即”或“监视”窗口中输入:dataReader.HasRows。这应该评估为 true。

  • 在此停止时Read(),打开“本地”窗口以检查 的所有属性dataReader。确保 FieldCount 符合您对SELECT报表的预期。

  • 当进入此Read()迭代时,是否创建了学生对象?dataReader["StructureID"]立即窗口和所有其他窗口的价值是什么?

这不是CommandBehavior.CloseConnection造成问题的原因。这只是告诉连接在您关闭数据读取器时也自行关闭。