Example #1
0
        /// <summary>
        /// Создает таблицу если она не существует, добавляет столбцы, изменяет параметры столбцов, переименовывает столбцы, создает индексы,
        /// пересоздает индексы при изменении параметров индексов, переименовывает индексы,
        /// в случае если данные операции требуются в соответствии со схемой таблицы.
        /// </summary>
        /// <param name="ensureColumns">При установленном true, применяет изменения к стобцам таблицы.</param>
        /// <param name="ensureIndexes">При установленном true, применяет изменения к индексам таблицы.</param>
        internal override DBTable.InitResult InitInternal(bool ensureColumns, bool ensureIndexes)
        {
            //стартуем операцию инициализации таблицы.
            DBTable.InitResult result = null;

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

                //после создания/инициализации всех таблиц и их столбцов
                //инициализируем триггеры.
                if (ensureColumns)
                {
                    this.InitPrincipalTriggers();
                }

                //завершаем область транзакций.
                transactionScope.Complete();
            }


            //возвращаем результат.
            return(result);
        }
Example #2
0
        /// <summary>
        /// Инициализирует триггеры таблицы.
        /// </summary>
        internal override void InitTriggersInternal()
        {
            //запускаем код в одной общей Sql-транзакции.
            using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope())
            {
                //инициализируем триггеры данной таблицы.
                this.InitPrincipalTriggers();

                //завершаем область транзакций.
                transactionScope.Complete();
            }
        }
Example #3
0
        /// <summary>
        /// Удаляет таблицу из базы данных.
        /// </summary>
        internal override void DeleteInternal()
        {
            //запускаем код в одной общей Sql-транзакции.
            using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope())
            {
                //удаляем основную таблицу.
                base.DeleteInternal();

                //завершаем область транзакций.
                transactionScope.Complete();
            }
        }
Example #4
0
        /// <summary>
        /// Переименовывает индексы и триггеры в соответствии с новым префиксом.
        /// </summary>
        internal override void ChangePrefixInternal()
        {
            //запускаем код в одной общей Sql-транзакции.
            using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope())
            {
                //переименовываем префикс в основной таблице.
                base.ChangePrefixInternal();

                //завершаем область транзакций.
                transactionScope.Complete();
            }
        }
Example #5
0
        /// <summary>
        /// Удаляет данные из таблицы в соответствии с заданным условием.
        /// </summary>
        /// <param name="deleteCondition">Условие удаления данных.</param>
        internal override void DeleteDataInternal(string deleteCondition)
        {
            //запускаем код в одной общей Sql-транзакции.
            using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope())
            {
                //удаляем данные из исходной таблицы.
                base.DeleteDataInternal(deleteCondition);

                //завершаем область транзакций.
                transactionScope.Complete();
            }
        }
Example #6
0
        /// <summary>
        /// Переименовывает таблицу.
        /// </summary>
        internal override void RenameInternal()
        {
            //запускаем код в одной общей Sql-транзакции.
            using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope())
            {
                //переименовываем таблицу.
                base.RenameInternal();

                //завершаем область транзакций.
                transactionScope.Complete();
            }
        }
Example #7
0
        /// <summary>
        /// Обновляет параметры столбца.
        /// </summary>
        /// <param name="columnName">Название столбца.</param>
        internal override void UpdateColumnInternal(string columnName)
        {
            if (string.IsNullOrEmpty(columnName))
            {
                throw new ArgumentNullException("columnName");
            }

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

                //завершаем область транзакций.
                transactionScope.Complete();
            }
        }
Example #8
0
        /// <summary>
        /// Переименовывает столбец, с названием columnName.
        /// </summary>
        /// <param name="columnName">Новое название переименовываемого столбца.</param>
        internal override void RenameColumnInternal(string columnName)
        {
            if (string.IsNullOrEmpty(columnName))
            {
                throw new ArgumentNullException("columnName");
            }

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

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

                //завершаем область транзакций.
                transactionScope.Complete();
            }
        }
Example #9
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));
                    }
                }
            }
        }