概述
将一个数据库的数据连结构同步到另外一个空白数据库
代码如下:
/// <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");