Тесная связь в деструкторе

Я пытался закрыть соединение в деструкторе моего класса, чтобы быть уверенным, что если я забуду закрыть его - оно закроется автоматически, и сработает исключение.

Я немного искал и обнаружил, что это невозможно.

Теперь я попытался закрыть его дважды - и это работает!!!

Но мне интересно, если это хорошее решение. что ты думаешь?

вот код

public class MyCommand : IDisposable
{
    public readonly DbCommand command;
    public MyCommand(string ConnectionString, DbProviderFactory factory)
    {
        var tempConnexion = factory.CreateConnection();
        tempConnexion.ConnectionString = ConnectionString;
        tempConnexion.Open();
        var t = tempConnexion.BeginTransaction(IsolationLevel.ReadCommitted);
        command = tempConnexion.CreateCommand();
        command.Connection = tempConnexion;
        command.Transaction = t;
    }
    public MyCommand(string ConnectionString, DbProviderFactory factory, string requete)
        : this(ConnectionString, factory)
    {
        command.CommandText = requete;
    }
    public MyCommand(string ConnectionString, string provider)
        : this(ConnectionString, DbProviderFactories.GetFactory(provider)) { }
    public MyCommand(string ConnectionString, string provider, string requete)
        : this(ConnectionString, DbProviderFactories.GetFactory(provider), requete) { }

    public static implicit operator DbCommand(myCommand c)
    {
        return c.command;
    }
    public void Dispose()
    {
        try
        {
            var t = command.Transaction;
            if (t != null)
            {

                t.Commit();
                t.Dispose();
            }
        }
        catch { }
        try
        {
            if (command.Connection != null)
                command.Connection.Dispose();
            command.Dispose();
        }
        catch { }
    }
    ~MyCommand()
    {
        if (command != null && command.Connection != null && command.Connection.State == ConnectionState.Open)
            for (int i = 0; i < 2; i++)//twice to get the handle - it's working!
                Dispose();
    }
}

1 ответ

Решение

Соединение закрыто Dispose метод не деструктором.

Также смотрите предупреждение MSDN

предосторожность

Не вызывайте Close или Dispose для Connection, DataReader или любого другого управляемого объекта в методе Finalize вашего класса. В финализаторе вы должны освобождать только неуправляемые ресурсы, которыми непосредственно владеет ваш класс. Если ваш класс не владеет какими-либо неуправляемыми ресурсами, не включайте метод Finalize в определение класса.

Гораздо лучший и рекомендуемый способ работы с соединением - использовать оператор USING, который эквивалентен

try
{
  // your code
}
finally
{
  myobject.Dispose();
}
Другие вопросы по тегам