Esempio n. 1
0
        /// <summary>
        /// Добавляет столбец в таблицу.
        /// </summary>
        /// <param name="columnName"></param>
        internal override void AddColumnInternal(string columnName)
        {
            if (string.IsNullOrEmpty(columnName))
            {
                throw new ArgumentNullException("columnName");
            }

            //запускаем код в одной общей Sql-транзакции.
            using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope())
            {
                //добавляем столбец в основную таблицу.
                base.AddColumnInternal(columnName);

                //инициализируем триггеры
                this.InitPrincipalTriggers();

                //завершаем область транзакций.
                transactionScope.Complete();
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Выполняет код в транзакции запроса к базам данных.
        /// </summary>
        /// <param name="transactionCode">Код для выполнения в транзакции.</param>
        /// <param name="createNew">При установленном значении true, создаёт новую транзакцию даже при наличии транзакции уже инициализированной в контексте выполнения кода.</param>
        private void ExecuteTransactionInternal(TransactionCode transactionCode, bool createNew)
        {
            //создаем область транзакции.
            DBTransactionScope transactionScope     = this.CreateTransactionScope(createNew);
            Exception          transactionException = null;

            try
            {
                using (OperationContext executeTransactionContext = this.RunExecuteTransactionContext())
                {
                    //выполняем код.
                    transactionCode();

                    //помечаем транзакцию, как успешно выполненную.
                    transactionScope.Complete();
                }
            }
            catch (Exception ex)
            {
                //устанавливаем ошибку транзакции.
                transactionException = ex;

                //логируем ошибку транзакции.
                this.WriteEventLog(transactionException);

                //перенаправляем ошибку транзакции вверх по стэку.
                throw;
            }
            finally
            {
                //выполняем очистку области транзакции.
                Exception disposeException = null;
                try
                {
                    //очищаем область транзакции.
                    transactionScope.Dispose();
                }
                catch (Exception ex)
                {
                    //устанавливаем ошибку очистки.
                    disposeException = ex;

                    //логируем ошибку очистки.
                    this.WriteEventLog(disposeException);

                    //перенаправляем ошибку очистки вверх по стэку.
                    throw;
                }
                finally
                {
                    //обрабатываем ошибку транзакции и ошибку очистки.
                    if (transactionException != null && disposeException != null)
                    {
                        //перенаправляем вверх по стэку суммарную ошибку транзакции и очистки.
                        throw new Exception(string.Format(@"Возникли ошибки при выполнении и очистки транзакции. 
ExecuteTransactionError: {0} 
DisposeTransactionError: {1}", transactionException, disposeException));
                    }
                }
            }
        }