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

提前感谢您的帮助。

克莱尔

4

5 回答 5

2

如图所示,您的代码很好。我已经把它带入了一个测试项目,它可以工作。目前尚不清楚为什么您会使用上面显示的代码收到此消息。以下是一些调试提示/建议。我希望它们对你有价值。

  • while (dataReader.Read()). 在它进入它的代码块之前,在你的即时或观察窗口中输入这个:dataReader.HasRows。那应该评估为真。

  • 停止时Read(),打开您的 Locals 窗口以检查dataReader. 确保 FieldCount 是您对SELECT语句的期望。

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

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

于 2010-08-12T15:41:10.357 回答
2

当您在 C# 中使用 Using 时,在使用的最后一个 } 之后,连接会自动关闭,这就是为什么当您尝试读取他时会关闭字段计数,因为这是不可能的,因为您想要这些数据,然后读取在关闭使用之前,或者你可以手动打开和关闭连接,而不是使用(使用)

于 2014-04-15T14:04:42.173 回答
0

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

于 2014-06-12T09:35:29.780 回答
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

于 2019-02-23T21:26:22.710 回答
0

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

于 2020-02-14T18:00:18.733 回答