while(reader.Read())会自动关闭吗?

时间:2015-06-02 11:57:36

标签: c#

通常当我使用C#进行编码时,我或者用两种方式之一写出SqlDataReader

reader.Read();

if (reader.HasRows)
{
    // Code here
}

reader.Close();

或者:

while (reader.Read())
{
    // Code here
}

在第一个例子中,我打开SqlDataReader并关闭它。第二个我在while循环中调用reader.Read()

我的问题是:在读完所有数据后,调用reader.Read()是否会自行关闭?或者我应该拨打reader.Close()吗?

7 个答案:

答案 0 :(得分:4)

  

在读取所有数据后,调用reader.Read()是否会自行关闭?

没有。 Read() method只是将光标移动到下一行。 第一条记录之前的默认位置是。这就是为什么你必须使用这种方法读取阅读器中的任何数据。

  

我还应该打电话给读者。关闭();

是,但不是这样,请使用using statement自动处理您的SqlDataReader

using(var reader = command.ExecuteReader())
{
     while (reader.Read())
     {
         // Code here
     }
} <-- your reader will be disposed here.

答案 1 :(得分:4)

或者:

using(SqlDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        // Code here
    }
}

...当IDisposable.Dispose块结束时(如果它不是IDisposable编译器将会哭泣,如果在using语句中分配的对象是using,则调用IDisposable! ),这是一个语法糖:

SqlDataReader reader = cmd.ExecuteReader();

try
{
    while (reader.Read())
    {
        // Code here
    }
}
finally
{
    if(reader != null)
    {
        reader.Dispose();
    }
}

您可以拨打CloseDispose,但始终使用using方法,以避免在发生异常时留下一次性对象非处置在调用CloseDispose之前抛出。

更新...

正如一些评论者所说,using阻止也是为了模糊不清,这样就不可能忘记调用Dispose,因为它是隐含的。

顺便说一句,这是主观的,因为谁错过Dispose调用可能不会使用using阻止......根据我的经验,还有很多.NET开发人员没有了解对象为何实现IDisposable 的重要性。

这不仅仅是一个美观的细节:如果类型实现IDisposable是因为当你实例化Dispose类型并且你不再需要它时,必须调用IDisposable或者在应用程序生命周期的特定时刻。 但无论如何,IDisposable.Dispose来电是强制性的

我对该主题的两分钱将是using块是一种不必向无经验的.NET开发人员解释低级细节的好方法。定义团队开发规则/指南更容易,如果没有明确的理由,IDisposable块中的using对象未实例化,则可以声明代码审核不会通过强>

答案 2 :(得分:1)

不,Read不会关闭它,如果没有你告诉它,任何其他方法也不会这样做。所以你必须一直直接关闭它。

但是,由于SqlDataReader实现IDisposable,您应该将阅读器包装在using块中:

using (SqlDataReader reader = GetReaderFromSomewhere())
{
    while (reader.Read())
    {
        // Code here
    }
}

然后您无需担心手动关闭它,并且只要您离开using块就会自动关闭。

答案 3 :(得分:1)

不,它会一直打开,直到GC清理它,这可能会或可能不会立即发生,或者根本不会发生。

你应该选择以下内容:

using(var reader = cmd.ExecuteReader())
{
    while(reader.Read())
    {
         //do stuff with row
    }
}

因为读者将在退出使用后被处理并将被关闭。

答案 4 :(得分:0)

不,它不会关闭你的dataReader。处理对象时,是的,它将关闭。作为一个很好的实践,由于您的类型实现了IDisposable,因此更喜欢使用using关键字。

using (var reader = command.ExecuteReader())
{
    while (reader.Read())
    {
      // ....
    }
}

它会让你感到羞怯。

答案 5 :(得分:0)

是的,您需要关闭连接。

SqlDataReader是IDisposable,因此如果你可以使用它是最安全的使用方法:

using (SqlDataReader reader = GetSqlDataReader())
{
    while (reader.Read())
    {
        // Code here
    }
}

答案 6 :(得分:0)

不,它没有。 SqlDataReader实现IDisposable以释放非托管资源 - 对此进行编码的最简单方法是将您对阅读器的使用包装在using block内:

using (var reader = getYourReader())
{
    while (reader.Read())
    {
         // work is done here
    }
} // leaving the using block reader.Dispose() will be called automatically