示例#1
0
        /// <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();
                            }
                        }
                    }
                }
            }
        }