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

问题描述 投票:1回答:5

当我尝试执行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();
        }
    }

提前感谢您的帮助。

克莱尔

datareader executereader
5个回答
1
投票

您显示的代码很好。我已经将其带入一个测试项目,并且可以正常工作。目前尚不清楚为什么使用上面显示的代码会收到此消息。以下是一些调试技巧/建议。我希望它们对您有价值。

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

  • 虽然在Read()上停止,请打开“本地”窗口以检查dataReader的所有属性。确保FieldCount是您从SELECT语句中期望的值。

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

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


1
投票

[当您使用C#中的using时,最后一个}之后,Connection会自动关闭,这就是为什么您尝试读取他时要关闭fieldcount的原因,这是不可能的,因为您想要这些数据,请先阅读,然后再关闭使用方式,或者您可以通过不使用(使用方式)来手动打开和关闭连接]


0
投票

当我收到该错误时,它恰好是命令超时问题(我正在读取一些大的二进制数据)。第一次尝试,我增加了命令超时(而不是连接超时!),问题就解决了。注意:在尝试找出问题时,我尝试监听(Sql)连接的StateChanged事件,但事实证明该连接从未处于“断开”状态。


0
投票

这里有同样的问题。测试了以上所有解决方案

  • 增加命令超时
  • 读取后关闭连接

这里是代码

    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已关闭= False


0
投票

我在使用VS.NET调试器并尝试检查一些IQueryable结果时遇到了此异常。错误的决定,因为IQueryable导致大表扫描。解决方法是停止并重新启动调试器,而不尝试预览此特定的IQueryable。

© www.soinside.com 2019 - 2024. All rights reserved.