通常当我使用C#进行编码时,我或者用两种方式之一写出SqlDataReader
:
reader.Read();
if (reader.HasRows)
{
// Code here
}
reader.Close();
或者:
while (reader.Read())
{
// Code here
}
在第一个例子中,我打开SqlDataReader
并关闭它。第二个我在while循环中调用reader.Read()
。
我的问题是:在读完所有数据后,调用reader.Read()
是否会自行关闭?或者我应该拨打reader.Close()
吗?
答案 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();
}
}
您可以拨打Close
或Dispose
,但始终使用using
方法,以避免在发生异常时留下一次性对象非处置在调用Close
或Dispose
之前抛出。
正如一些评论者所说,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