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

标签 c# design-patterns

如果我在 using block 中实例化一个 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();
    }
  }

最佳答案

如果它在 using block 中,那么它会自动关闭。您不需要明确关闭它。

顺便说一句,您示例中的 SqlCommand 是一次性的。您也应该在 using block 中创建它,否则它控制的任何资源都不会被释放,直到垃圾收集器收集为止。

您未处置的 SqlCommand 实际上是一个很好的例子,说明了为什么 C# 对 RAII 的模拟不是“真正的”RAII。您必须采取显式操作(制作 block )才能让 RAII 启动,这等同于显式关闭,尽管语法不同。

关于c# - 如果要处理 SqlDataReader,是否需要调用 close()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16366181/

相关文章:

c# - Transient 注入(inject) Singleton 有什么问题?

c# - 将选项设置为 FbTransaction

c# - 用工厂模式保存数据?

java - 如何计算、控制和更新客户信用?

c# - 如何创建 Nullable<T> 的实例?

c# - 将字符串转换为 double 时出现奇怪的输出

c# - ReferenceEquals 如何理解引用属于同一个对象?

algorithm - 如何处理域类中的依赖行为?

javascript - Javascript 是否有办法执行 "find_if"或 "FirstOrDefault"?

c# - 如何依赖注入(inject)类/类型?