/// <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); }
/// <summary> /// Инициализирует триггеры таблицы. /// </summary> internal override void InitTriggersInternal() { //запускаем код в одной общей Sql-транзакции. using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope()) { //инициализируем триггеры данной таблицы. this.InitPrincipalTriggers(); //завершаем область транзакций. transactionScope.Complete(); } }
/// <summary> /// Удаляет таблицу из базы данных. /// </summary> internal override void DeleteInternal() { //запускаем код в одной общей Sql-транзакции. using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope()) { //удаляем основную таблицу. base.DeleteInternal(); //завершаем область транзакций. transactionScope.Complete(); } }
/// <summary> /// Переименовывает индексы и триггеры в соответствии с новым префиксом. /// </summary> internal override void ChangePrefixInternal() { //запускаем код в одной общей Sql-транзакции. using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope()) { //переименовываем префикс в основной таблице. base.ChangePrefixInternal(); //завершаем область транзакций. transactionScope.Complete(); } }
/// <summary> /// Удаляет данные из таблицы в соответствии с заданным условием. /// </summary> /// <param name="deleteCondition">Условие удаления данных.</param> internal override void DeleteDataInternal(string deleteCondition) { //запускаем код в одной общей Sql-транзакции. using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope()) { //удаляем данные из исходной таблицы. base.DeleteDataInternal(deleteCondition); //завершаем область транзакций. transactionScope.Complete(); } }
/// <summary> /// Переименовывает таблицу. /// </summary> internal override void RenameInternal() { //запускаем код в одной общей Sql-транзакции. using (DBTransactionScope transactionScope = this.ConnectionContext.CreateTransactionScope()) { //переименовываем таблицу. base.RenameInternal(); //завершаем область транзакций. transactionScope.Complete(); } }
/// <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(); } }
/// <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(); } }
/// <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)); } } } }