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

时间:2010-08-12 07:16:47

标签: 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();
        }
    }

提前感谢您的帮助。

克莱尔

5 个答案:

答案 0 :(得分:1)

您显示的代码很好。我把它带入了一个测试项目,它的工作原理。目前还不清楚为什么你会用上面显示的代码得到这条消息。这里有一些调试技巧/建议。我希望它们对你有价值。

  • while (dataReader.Read())上创建一个断点。在输入其代码块之前,请在立即或观察窗口中输入:dataReader.HasRows。这应该评估为真。

  • Read()停止后,打开“本地”窗口以检查dataReader的所有属性。确保FieldCount符合您对SELECT声明的期望。

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

导致问题的不是CommandBehavior.CloseConnection。这只是告诉连接在关闭datareader时也会自行关闭。

答案 1 :(得分:1)

当您使用C#中的Using,在使用后的最后一次}之后,Connection会自动关闭,这就是为什么当你试图读取他时,你为什么要关闭fieldcount,因为这是不可能的,因为你想要那些数据,在关闭使用之前阅读,或者你可以通过不使用(使用)

手动打开和关闭连接

答案 2 :(得分:0)

当我收到该错误时,它恰好是命令超时问题(我正在阅读一些大型二进制数据)。作为第一次尝试,我增加了命令超时(不是连接超时!),问题解决了。 注意:在尝试找出问题时,我试图听取(Sql)连接的StateChanged事件,但事实证明连接永远不会处于“损坏”状态。

答案 3 :(得分: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的Closed = False

答案 4 :(得分:0)

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