/// <summary> /// 执行数据迁移 /// </summary> /// <param name="xmlPath">数据结构映射XML文件存放路径(需要确保两个库的结构相同)</param> /// <param name="oldConfig">源数据库</param> /// <param name="newConfig">目标数据库</param> public static void DoMigrate(string xmlPath, BaseConfigInfo oldConfig, BaseConfigInfo newConfig, List <string> tables) { //导入数据 string newConnString = newConfig.DBConnectionString.Replace("{$App}", AppDomain.CurrentDomain.BaseDirectory); IDbDriver driver = Installer.CreateDbDriver(newConfig.DBType); using (IConnection newConn = driver.CreateConnection(newConnString)) { if (Directory.Exists(xmlPath)) { DirectoryInfo dir = new DirectoryInfo(xmlPath); FileInfo[] files = dir.GetFiles("*.xml"); foreach (FileInfo file in files) { string xmlFile = file.FullName; ObjectAssistant oa = new ObjectAssistant(); if (oldConfig.DBConnectionString != "") { oldConfig.DBConnectionString = oldConfig.DBConnectionString.Replace("{$App}", AppDomain.CurrentDomain.BaseDirectory); oa.LoadDBConnectionString(oldConfig.DBConnectionString, oldConfig.DBDriver); } oa.LoadFromFile(xmlFile); //过滤:找出两个数据库都有的表对象 IDbDriver oldDriver = Installer.CreateDbDriver(oldConfig.DBType); IConnection oldConn = oldDriver.CreateConnection(oldConfig.DBConnectionString.Replace("{$App}", AppDomain.CurrentDomain.BaseDirectory)); List <string> objects = GetUpdateObjects(xmlFile, newConn, oldConn, tables); if (objects.Count > 0) { //进行数据转换 foreach (string tpName in objects) { if (tpName == "") { continue; } Type tp = Type.GetType(tpName); Type mt = typeof(MigrateObject <>); Type gt = mt.MakeGenericType(new Type[] { tp }); IMigrateObject mo = Activator.CreateInstance(gt) as IMigrateObject; mo.Connection = newConn; mo.Assistant = oa; mo.Update(); } } } } } }