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

预先感谢您的任何帮助。

克莱尔

有帮助吗?

解决方案

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

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

  • 虽然停在那 Read(), ,打开本地窗口以检查所有属性 dataReader. 。确保 FieldCount 符合您的预期 SELECT 陈述。

  • 当踏入这一步时 Read() 迭代,是否创建了学生对象?有什么价值 dataReader["StructureID"] 以及立即窗口中的所有其他内容?

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

其他提示

当您使用在C#中使用,后终于}从使用,连接自动关闭,为什么你段计数这就是被关闭时ü试图读懂他,因为这是不可能的,因为ü希望这些DATAS ,然后读之前关闭使用,或U可以通过不使用(使用)

打开和关闭手动连接,

当我得到的错误时,它正好是一个命令超时问题(我正在读一些大的二进制数据)。作为第一次尝试,我增加了命令超时(未连接超时!),问题就解决了。 注:试图找出问题,我试着听(SQL)连接的StateChanged事件,但事实证明,连接永不落“断开”状态

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

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

这是代码

    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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top