【发布时间】:2010-01-28 19:21:02
【问题描述】:
我通常这样写我的DataReader 代码:
try
{
dr = cmd.ExecuteReader(CommandBehavior.SingleResult);
while (dr.Read())
{
// Do stuff
}
}
finally
{
if (dr != null) { dr.Close(); }
}
将try 和finally 替换为using 块围绕DataReader 的创建是否安全?我想知道的原因是,在我看到的所有 Microsoft 示例中,它们都使用 using 进行连接,但总是在 DataReader 上显式调用 Close()。
这是一个例子 Retrieving Data Using a DataReader (ADO.NET):
static void HasRows(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}
【问题讨论】:
-
附带说明,我见过的大多数 MS 示例要么过于复杂,要么没有真正利用很多可用的语言功能。部分原因是他们只是简单地滚动了以前版本中的示例代码,实际上只检查它是否仍然运行。我的猜测是这些代码不是由他们最聪明的人维护的,因为这些代码从不聪明或高效。
-
@NotMe 从示例代码的质量来看,我多年来一直怀疑它是由入门级实习生编写和维护的,而不是实际设计课程的人首先。就像微软乏善可陈的 .NET 文档让我期待SO's new documentation expansion。
-
@Cupcake 在我看来不是骗子。这里的一个询问
using块是否会关闭数据读取器,另一个询问是否需要关闭它。不是一回事。 -
@ShadowWizard 说得好。