如果要处理SqlDataReader,我是否需要调用close()?

时间:2013-05-03 16:41:30

标签: c# design-patterns

如果我在using块中实例化SqlDataReader,我是否需要在阅读器上调用close()

查找下面显示的用户的简单示例。

  using (var connection = new SqlConnection(Settings.GetValue("SqlConnection")))
  {
    SqlCommand command = new SqlCommand("select * from Users where Id = @Id", connection);        
    command.Parameters.Add("@Id", SqlDbType.UniqueIdentifier);
    command.Parameters["@Id"].Value = id;

    using (SqlDataReader reader = command.ExecuteReaderWithRetry())
    {
      reader.Read();

      if (reader.HasRows)
      {
        //Do work
      }

      //Is this neccesary?
      reader.Close();
    }
  }

1 个答案:

答案 0 :(得分:12)

如果它在使用块中,则会自动关闭。您无需显式关闭它。

BTW你的例子中的SqlCommand是一次性的。您也应该在using块中创建它,否则它控制的任何资源都不会被释放,直到垃圾收集器收集。

你的不熟练的SqlCommand实际上是一个很好的例子,说明为什么C#的RAII仿真不是“真正的”RAII。你必须为RAII采取明确的行动(制作块),这相当于一个明确的关闭,虽然语法不同。