DbDataReader错误:在读取器关闭时调用Read的尝试无效。

3

你好,我正在尝试从一个方法中返回DataReader,但它返回了一个已关闭的DbDataReader对象。有什么办法解决这个问题吗?我愿意接受任何建议来改进代码。

谢谢

更新 我不想保持数据库连接处于打开状态。有没有办法在关闭连接后返回打开的DataReader。

internal DbDataReader ExecuteReader(SqlCommand command, CommandBehavior behavior, string connectionString)
  {
    DbDataReader dataReader = null;
    try
    {
      SqlConnection connection = GetConnection(connectionString);
      Open(connection);
      command.Connection = connection;
      command.CommandTimeout = 60;
      dataReader = command.ExecuteReader(behavior);
      Close(connection);
    }
    catch
    {
    }
    return dataReader;
}

如果您在 return dataReader; 上设置了断点,此时它是否已关闭? - Neil Knight
嗨@NeilKnight,是的,在那个点上它被关闭了。 - Scorpion
你可能还需要考虑一下空的catch块。你肯定不想吞噬所有的异常,对吧? - Bryan Crosby
嗨@BryanCrosby,它不是空的。我正在记录错误。我只是在发布时将其删除,以使其更短,更易读。谢谢。 - Scorpion
好的。我建议至少保留您要捕获的异常类型,例如catch(Exception exc)等。 - Bryan Crosby
1个回答

6

这是因为您关闭了数据库连接。它无法从已关闭的SqlConnection中读取数据。如果您想要重用连接,可以将一个"打开的连接"传递给方法,并在从DbDataReader使用数据之后关闭连接。


嗨@Adriano,如果我保持连接开放,会有问题吗? - Scorpion
2
你必须尽快关闭连接(服务器的连接是有限资源),即使它稍后会被垃圾回收器释放。这并不意味着你必须立即关闭连接,可以花时间消耗数据,然后再关闭连接。 - Adriano Repetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接