использование конструкции с sqlTransaction зависит от количества различных результатов действий - PullRequest
3 голосов
/ 09 апреля 2010

Мне интересно, если следующий код будет считаться безопасным?

using (SqlConnection cn = new SqlClient.SqlConnection(connectionString))
{
   cn.Open();
   using (SqlTransaction tr = cn.BeginTransaction())
   {
      try
      {

         if (!Data.DoSomething1(tr, p1, p2))
         {
            tr.Rollback();
            return false;
         }

         foreach (ItemType item in Items)
         {
            if (!Data.DoSomething2(tr, p3, p4))
            {
               tr.Rollback();
               return false;
            }
         }

         tr.Commit();
         return true;
      }
      catch (Exception myErr)
      {
         if (tr != null)
            tr.Rollback();

         throw myErr;
      }
      finally
      {
         if (cn != null)
         {
            cn.Close();
            cn.Dispose();
         }
      }
   }
}

Я хотел передать транзакцию 'tr' по ссылке, но не смог, потому что она находится внутри конструкции "using". Я хотел бы услышать предложения для лучшего подхода в подобных ситуациях.

Привет

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

Ваш блок finally не требуется, как и ваш внутренний оператор using.

Смысл выражения using в том, что вам не нужно использовать блоки try catch, один из них - простота, созданная для вас - это означает, что блок finally избыточен в вашем примере. Ваш внутренний блок использования также избыточен.

Хороший вопрос, хотя.

Шаблон для использования обоих этих предметов приведен здесь:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx

1 голос
/ 09 апреля 2010

Вам не нужно передавать транзакцию по ссылке. Это ссылочный тип, поэтому, когда вы передаете его функции, вы уже предоставляете ссылку. То, что вы делаете, прекрасно.

Хотя в вашем коде есть несколько других вещей, не связанных напрямую с вашим вопросом:

  • Вы действительно должны использовать throw;, а не throw myErr;.
  • Нет необходимости явно распоряжаться ресурсами, если они уже есть в выражении using. Вот для чего using.
...