Пример #1
0
        /// <summary>
        /// 数据库架构处理。
        /// </summary>
        /// <param name="context">上下文对象。</param>
        public DatabaseSchemaProcessResults Process(DatabaseSchemaContext context)
        {
            string fullName = TypeExtensions.FullName2(this.GetType());

            if (!_attribute.IsValid)
            {
                context.Log.Warning("{0}.Attribute.IsValid=false,[{1}]{2},{3}", fullName, _attribute.Order, _attribute.TableName, _attribute.Description);
                return(DatabaseSchemaProcessResults.Ignore);
            }
            context.DataContext.ChangeDatabase();
            context.Log.Info("执行 [{0} {1}] {2} {3} {4}",
                             EnumExtensions.ToName(_attribute.Type).PadRight(6, ' '), _attribute.Order.ToString().PadRight(8, ' '),
                             _attribute.TableName.PadRight(32, ' '), _attribute.Description.PadRight(32, ' '),
                             fullName);
            DatabaseSchemaProcessResults result;

            try {
                result = OnProcess(context);
                context.Log.Info("     [{0}] {1}", EnumExtensions.ToName(result), fullName);
            } catch (System.Exception error) {
                result = DatabaseSchemaProcessResults.Error;
                context.Log.Info("     [{0}] {1}", EnumExtensions.ToName(result), fullName);
                context.Log.Error(LogBase.ExceptionToString(error));
            }
            return(result);
        }
        /// <summary>
        /// 数据库架构处理(内部开启事务,一旦有错误,自动回滚)。
        /// </summary>
        /// <param name="context">上下文对象。</param>
        /// <returns>返回是否执行成功。</returns>
        public bool Process(DatabaseSchemaContext context)
        {
            System.Collections.Generic.List <DatabaseSchemaHandler> list = Sort();
            context.Log.Info("数据库架构 {0}项", list.Count);
            context.Log.Info("数据库架构处理[{0}] 开始", context.DataContext.Connection.DatabaseName);
            bool success = true;

            int[] counts = new int[3];
            int   t      = Environment.TickCount;

            foreach (DatabaseSchemaHandler item in list.FindAll(p => p.Attribute.Type == DatabaseSchemaTypes.TableSpace))
            {
                DatabaseSchemaProcessResults result = item.Process(context);
                counts[(int)result]++;
                if (result == DatabaseSchemaProcessResults.Error)
                {
                    success = false;
                }
            }
            {
                context.DataContext.BeginTransaction();
                foreach (DatabaseSchemaHandler item in list.FindAll(p => p.Attribute.Type != DatabaseSchemaTypes.TableSpace))
                {
                    DatabaseSchemaProcessResults result = item.Process(context);
                    counts[(int)result]++;
                    if (result == DatabaseSchemaProcessResults.Error)
                    {
                        success = false;
                    }
                }
                context.Log.Info("数据库架构处理[{0}] 成功:{1},错误:{2},忽略:{3}", context.DataContext.Connection.DatabaseName,
                                 counts[0], counts[1], counts[2]);
                if (!success)
                {
                    context.Log.Info("数据库架构处理[{0}] 回滚", context.DataContext.Connection.DatabaseName);
                    context.DataContext.RollbackTransaction();
                }
                else
                {
                    context.Log.Info("数据库架构处理[{0}] 提交", context.DataContext.Connection.DatabaseName);
                    context.DataContext.CommitTransaction();
                }
            }
            t = Environment.TickCount - t;
            context.Log.Info("数据库架构处理[{0}] 完成,用时{1}ms", context.DataContext.Connection.DatabaseName, t);

            return(success);
        }
Пример #3
0
 /// <summary>
 /// 数据库架构处理。
 /// </summary>
 /// <param name="context">上下文对象。</param>
 /// <returns>返回处理结果。</returns>
 protected abstract DatabaseSchemaProcessResults OnProcess(DatabaseSchemaContext context);