Я избавляюсь от своего ODBCConnection? - PullRequest
3 голосов
/ 02 июня 2011

Я использую вспомогательный метод, подобный этому:

    private OdbcCommand GetCommand(string sql)
    {
        string conString = "blah";
        var con = new OdbcConnection(conString);
        var cmd = new OdbcCommand(sql, con);
        return cmd;
    }

Затем я использую его так:

using (var cmd = GetCommand("select * from myTable")
{
    cmd.connection.open();
    using(var reader = cmd.ExecuteReader())
    {
    }
}

Вот второй пример:

    public static OdbcDataReader GetReader(string conString,string sql)
    {
        var cmd = GetCommand(conString, sql);
        cmd.Connection.Open();
        return cmd.ExecuteReader();
    }

используется так:

     using(var reader = GetReader("blah","select * from blah")
    {
    }

В этих двух случаях я избавляюсь от объектов подключения и cmd?Я думаю, что соединение не удаляется в первом, и ни соединение, ни cmd во втором не так ли?

Нужно ли мне проделать долгий путь, чтобы обеспечить правильное удаление, или есть более короткий подход??

using (var con ...)
    using (var cmd)
        using (var reader)

Ответы [ 2 ]

8 голосов
/ 02 июня 2011

Короче говоря, если оно имеет Dispose, то вам следует позвонить.Вы не можете предполагать, что другой объект избавится от объекта, который вы ему передали.

Утилизация объекта команды не приведет к удалению объекта подключения, поскольку вы можете снова использовать соединение после того, как закончите скоманда.Утилизация каждого - лучший подход.

4 голосов
/ 02 июня 2011

Для обоих примеров, когда вы оборачиваете свой Reader в блок использования, вы закрываете соединение с существующим кодом, ЕСЛИ вы используете переопределение, которое принимает CommandBehavior, и устанавливаете его в «CloseConnection»

using(var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)){}

см. http://msdn.microsoft.com/en-us/library/s9bz2k02.aspx

Microsoft знает, что соединение должно оставаться открытым, пока читатель используется, и поэтому создала возможность закрыть соединение, когда читатель закрыт.

Вы правы, что команда не находится во втором примере.

...