2013-05-01 60 views
2

我已经看到了这个在生成代码分析警告一些旧式代码:DbCommand和连接 - 为什么配置不关闭底层连接?

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.Connection财产必须另外封闭的的DbCommand处置。我会认为dbCommand会处理任何儿童一次性对象,在这种情况下,连接。如果情况并非如此,为什么?

+0

如果您想为几个命令使用相同的连接,该怎么办?一般来说,如果您将可丢弃对象传递给另一个可丢弃对象,那么您应该为要传入的对象负责。 – 2013-05-01 10:14:27

+0

好的,但从代码中可以看出,命令对象对已存在引用的对象创建的连接而不是它自己创建的连接。在这种情况下,如果使用db和dbCommand变量,我猜测db处理会关闭连接? – jaffa 2013-05-01 10:23:53

+0

我假设'strDBCon'是一个字符串,所以这意味着数据库对象正在创建连接对象,这对我来说意味着它是'Disposable',并且在处置它时会处理它创建的连接。 – 2013-05-01 10:26:02

回答

3

类型在这方面有一个选择,要么取得一件东西的所有权,要么只是利用一件东西。就你的情况而言,具体而言,你所做的只是传入一个你创建的现有实例,并且很可能会再次使用。

如果类型是明确构建与传递一个类型的实例,你可能期望其采取该实例的所有权,因此,管理作为其处置模式的一部分,但不是在的情况下瞬态方法调用。

+0

好的,我明白了,谢谢。请看我上次对乔治的编辑。 – jaffa 2013-05-01 10:25:10

相关问题