NewLife中XCode数据库数据同步【转】

所属源码: XCode
sam 2022-04-01 02:06:22

概述

将一个数据库的数据连结构同步到另外一个空白数据库

代码如下:

        /// <summary>
        /// 拷贝数据库,只需要数据库连接字符串和源数据库即可
        /// </summary>
        /// <param name="originConnName">源数据库连接字符串名</param>
        /// <param name="desConnName">目的数据库连接字符串名</param>
        /// <param name="perCount">每次获取的记录数目,如果默认-1则会自动调用函数计算一个合理值</param>
        public static void CopyDataBase(string originConnName, string desConnName, int perCount = -1)
        {
            //思路:通过源数据库获取架构信息,然后反向工程,然后导出数据
            var dal = DAL.Create(originConnName);

            //获取源数据库的架构信息
            var tableList = new List<IDataTable>();

            // 处理表的架构信息
            foreach (var dataTable in dal.Tables)
            {
                //过滤掉视图
                if (dataTable.IsView) continue;

                // 2019-03-31 处理列名称,后续版本会修复此bug,不用此处理
                CheckColumnName(dataTable.Columns);

                // 修正列的类型
                FixColumns(dataTable.Columns);

                tableList.Add(dataTable);
            }

            dal.SyncAll(tableList.ToArray(), desConnName, true);
        }

        /// <summary>
        /// 兼容处理,类型转换
        /// </summary>
        /// <param name="columns"></param>
        public static void FixColumns(List<IDataColumn> columns)
        {
            if (columns.Count < 1)
            {
                return;
            }

            var indexColumns = columns[0].Table.Indexes.SelectMany(s => s.Columns).ToArray();
            foreach (var column in columns)
            {
                // 主键、唯一、类型为text的全部修改为varchar(50)
                if ((!column.PrimaryKey &&
                     !indexColumns.Any(a => a.Equals(column.Name, StringComparison.OrdinalIgnoreCase))) ||
                    !column.RawType.Contains("text", StringComparison.OrdinalIgnoreCase)) continue;

                column.RawType = "varchar(50)";
                column.Length = 50;
            }
        }

        public static void CheckColumnName(List<IDataColumn> columns)
        {
            foreach (var dataTableColumn in columns)
            {
                if (dataTableColumn.Name.IsNullOrWhiteSpace())
                {
                    dataTableColumn.Name = dataTableColumn.ColumnName;
                }
            }
        }

使用

            DAL.AddConnStr("jpyedumysql", "host=123.xx.xx.123;port=3309;database=JpyEdu;uid=JpyEdu;pwd=Jxxx;Convert Zero Datetime=True;Allow User Variables=True;", null, "MySql");
            DAL.AddConnStr("jpysqlserver", "server=121.xx.xx.77;database=Jxxx;uid=rdsuser;pwd=jxxx;", null, "SqlServer");
            
            CopyDataBase("jpyedumysql", "jpysqlserver");


回帖
  • 消灭零回复
相关文章