DbCommand和连接 - 为什么配置不关闭底层连接?

时间:2013-05-01 10:12:57

标签: c# .net dispose

我在一些生成代码分析警告的遗留代码中看到了这一点:

  Database db = DatabaseFactory.CreateDatabase(strDBCon);
  DbCommand dbCommand = db.GetSqlStringCommand(sb.ToString());

  using (IDataReader dataReader = db.ExecuteReader(dbCommand))
  {
     while (dataReader.Read())
     {
     }
     dataReader.Close();  // <-- this is redundant as close is covered by using's implicit dispose
  }
  dbCommand.Connection.Close();
  dbCommand.Dispose();
  db = null;

我在这里读到,除了处理dbCommand之外,必须关闭dbCommand.Connection属性。我原以为dbCommand会处理任何子一次性对象,在本例中是Connection。如果不是这样,为什么?

1 个答案:

答案 0 :(得分:3)

在这方面,类型可以选择取得物品的所有权或仅利用物品。在您的情况下,具体而言,您所做的只是传递您已创建的现有实例,并且可能期望再次使用。

如果类型是使用传入类型的实例显式构造,您可能希望它取得该实例的所有权,因此将其作为其处置模式的一部分进行管理,但不是瞬态方法调用的情况。