Почему использование оператор использования с SqlTransaction?

Самый легкий способ понять его к динамическому программированию Google.

Это - алгоритм, это было одолжено от Информационного поиска и используется в большой степени в современной дневной биоинформатике, чтобы видеть, как similiar две последовательности генов.

Оптимальное решение использует динамическое программирование и рекурсию.

Это - очень решенная проблема с большим количеством решений. Просто Google вокруг, пока Вы не находите некоторый открытый исходный код.

47
задан MDStephens 14 July 2009 в 20:48
поделиться

8 ответов

Оператор using должен использоваться каждый раз, когда вы создаете экземпляр класса, который реализует IDisposable в рамках блока . Это гарантирует, что метод Dispose () будет вызываться в этом экземпляре, независимо от того, выбрано ли исключение.

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

Правильный способ сделать это:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"])) {
    cn.Open();
    using (SqlTransaction tr = cn.BeginTransaction()) {
        //some code
        tr.Commit();
    }
}

Обратите внимание, что если в вашем классе есть члены экземпляров типов, реализующих IDisposable , тогда ваш класс должен реализовать ] IDisposable и удалите эти элементы во время собственного вызова Dispose () .

57
ответ дан 26 November 2019 в 19:25
поделиться

По сути, using делает то же самое, что и вы, за исключением блока int a finally вместо перехвата всех исключений:

using (SqlConnection cn = new SqlConnection())
{
     using (SqlTransaction tr = cn.BeginTransaction())
     {
      //some code
      tr.Commit();
     }
}

то же самое, только гораздо меньше кода :)

{
    SqlConnection cn = null;
    try
    {
       cn = new SqlConnection();
       {
           SqlTransaction tr = null;
           try
           {
               tr = cn.BeginTransaction())

               //some code
               tr.Commit();
            }
            finally
            {
                if(tr != null && tr is IDisposable)
                {
                    tr.Dispose();
                }
            }
        }
    }
    finally
    {
        if(cn != null && cn is IDisposable)
        {
            cn.Dispose();
        }
    }
}
15
ответ дан 26 November 2019 в 19:25
поделиться

Причина этого в том, что объект SqlTransaction откатится в своем методе Dispose (), если он не был зафиксирован явно (например, если возникло исключение). Другими словами, он имеет тот же эффект, что и ваш код, только немного чище.

28
ответ дан 26 November 2019 в 19:25
поделиться

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

В этом случае вы неправильно реализовали шаблон. Что произойдет в вашем коде, если вызов tr.RollBack () также вызовет исключение?

6
ответ дан 26 November 2019 в 19:25
поделиться

Оператор using закрывает и удаляет ваше соединение и транзакцию за вас. Это эквивалентно блоку finally в вашем try / catch, который выполняет удаление.

Вы также можете сжать блоки using примерно так ...

using (SqlConnection cn = new SqlConnection())
using (SqlTransaction tr = cn.BeginTransaction())     
{
      //some code
      tr.Commit();
}

, что будет примерно таким же, как:

SqlConnection cn = null;
SqlTransaction tr = null;
try
{
    cn = new SqlConnection());
    tr = cn.BeginTransaction());

    //some code
    tr.Commit();
}
finally
{
    if (cn != null)
        cn.Dispose();
    if (tr != null)    
        tr.Dispose();
}
4
ответ дан 26 November 2019 в 19:25
поделиться

Если вы не используете блок using (), вам придется явно вызвать метод .Dispose () объектов SqlConnection и SqlTransaction. Если вы этого не сделаете, то неуправляемые ресурсы не будут освобождены и могут вызвать утечку памяти или другие проблемы.

3
ответ дан 26 November 2019 в 19:25
поделиться

Оператор Using - это сокращение для правильной обработки ресурса. Дополнительную информацию можно найти в статье MSDN об использовании оператора

0
ответ дан 26 November 2019 в 19:25
поделиться

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

1
ответ дан 26 November 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: