利用XCode 20行代码搞定任何数据库的迁移

      本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html

先说明一下,本文使用的Xcode不是Mac的Xcode,而且Newlife团队开发的一个.NET开发组件。其历史也有将近10年,因此大家不要误会。
新生命开发团队的相关信息:
QQ群:1600800
博客:http://nnhy.cnblogs.com
论坛:http://www.53wb.com
     前面2篇博客,使用Xcode进行了数据库反向工程以及自动向数据库插入测试数据的功能,其实上面的学习过程是为了今天的这个东西-数据库迁移工具。利用昨天的测试数据,今天将利用Xcode编写一段代码,进行数据库之间的转换和迁移,不仅包括数据库架构,同时包括数据库中的数据记录。下面记录一下开发过程:

1.为什么要进行数据库迁移

这是一个很常见的需求。现在数据库众多,有时候开发和部署的数据库不一样,或者说在软件运行过程中,由于某些原因要换数据库等得。对于程序员来说提到切换数据库,可能对一部分人来说是噩梦,虽然很多工具实现了通过切换配置文件,来切换数据库,但仍然需要建立好数据库才行,或者利用SQL语句,先在新的数据库平台建立数据库。这样程序是不变,但数据库还是有变化,还得动手去数据库做点东西。那么使用Xcode的目的是什么,就是利用Xcode,不用在数据库做任何东西,包括新的数据库,只需要改变一个配置文件即可。

2.功能要求

1.同样是要使用Xcode,前面博客已经实现了一些数据库操作的功能,如数据库反向工程,插入随机数据等。
2.不需要手动在外部数据库平台做任何事情,只需要修改数据库连接字符串,以及为了考虑转换速度,设置几个参数。
3.适用于任何2种数据库之间的迁移转换,据我所知,目前支持的数据库有:MSSQL,Mysql,Oracle,Access,Sqlite,PostgreSQL,Firebird等等,当然还有接口,给你最大的自由支持其他网络数据库。
4.数据库迁移包括数据库架构(表、字段等全部信息)和所有数据记录。
5.不需要生成实体类。 
6.下一步开发数据库备份功能(备份数据库架构和数据记录),这样备份的数据可以导入到任何数据库中(这一点是不是也很强悍),这不是简单的导出SQL语句,毕竟导出的SQL,数据库之间通用性不那么高。

这些东西还不够吸引你吗?而上面的前5个功能,在Newlife.Xcode的支持下只需要短短20行代码。呵呵,有点嘘头,当然对上千万条数据的数据库还要考虑性能,这里面也只稍微考虑一下。看看过程吧。

 3. 开发过程  

     首先开发思路,如果了解前2篇博客,就会很容易得到这个思路:利用Xcode获取源数据库的架构信息,然后利用反向工程在新数据库平台建立数据库(迁移架构信息),然后对每个表,获取实体操作接口,并批量分页获取数据,并将这些数据插入到新的数据库表中。很简单,前后实现代码20行左右。如下所示,有注释:

View Code
 1  /// <summary>
 2         /// 拷贝数据库,只需要数据库连接字符串和源数据库即可
 3         /// </summary>
 4         /// <param name="originConn">源数据库连接字符串</param>
 5         /// <param name="desConn">目的数据库连接字符串</param>
 6         /// <param name="perCount">每次获取的记录数目,如果默认-1则会自动调用函数计算一个合理值</param>
 7         public static void CopyDataBase(string originConn,string desConn,int perCount = -1)
 8         {
 9             //思路:通过源数据库获取架构信息,然后反向工程,然后导出数据            
10             DAL dal = DAL.Create(originConn);
11             List<IDataTable> tableList = dal.Tables;//获取源数据库的架构信息
12             tableList.RemoveAll(t => t.IsView);//过滤掉视图
13             //首先拷贝数据库架构            
14             DAL desDal = DAL.Create(desConn);//要在配置文件中启用数据库架构才行 
15             desDal.Db.CreateMetaData().SetTables(tableList.ToArray());               
16             //然后依次拷贝每个表中的数据
17             foreach (var item in tableList)
18             {
19                 //首先根据表名称获取当前表的实体操作接口
20                 IEntityOperate Factory = dal.CreateOperate(item.Name);
21                 //分页获取数据,并更新到新的数据库,通过更改数据库连接来完成
22                 int allCount = Factory.FindCount ();
23                 if (perCount < 0) perCount = GetDataRowsPerConvert (allCount );
24                 int pages = (int)Math.Ceiling ((double)((double )allCount/(double )perCount));
25                 for (int i = 0; i < pages ; i++)
26                 {
27                     Factory.ConnName = originConn;
28                     IEntityList modelList = Factory.FindAll(string.Empty, string.Empty, string.Empty, i * perCount, perCount);
29                     Factory.ConnName = desConn;
30                     modelList.Insert(true);
31                 }
32                 Console.WriteLine("数据库{0} 数据转移完成!",item.Name );
33             }
34         }
35 
36         /// <summary>
37         /// 根据数据表的记录总数来设置一个合理的每次转换数目。数据量大,一次性导出导入不合理
38         /// </summary>
39         /// <param name="allCount">数据表记录总数</param>
40         /// <returns>每次转换的记录数</returns>
41         private static int GetDataRowsPerConvert(int allCount)
42         {
43             if (allCount < 1000return 200;
44             else if (allCount < 5000return 500;
45             else if (allCount < 50000return 1000;
46             else return 1500;
47         }

    实现上面功能时出了点小问题,导致数据插入不了新数据库,因为我使用的是Save(),而不是Insert(),这2个东西还是有点差别,呵呵,多调试了2个小时,最后还是石头指出来的。

上面代码我测试了一下,从MSSQL 2005 迁移到 Mysql5.1,顺利完成。只测试了300条数据。也没有出现任何错误。应该算是没什么大问题,小问题的话,需要的人拿过去,修改下。这里只提供个思路,可以集成到自己的开发工具和应用软件中去,如加一个异步处理,多线程之类的。下一步打算做数据库备份,就是上面要求的最后一个,这个对于小型数据库来说,还是比较容易的,关键是大数据库有点难办,希望大家也给点意见啊。
4.改进  
      这几篇博客都只是一个思路,从中可以看出Xcode操作数据库的便利性和其通用性。数据库迁移功能已经实现了最基本的功能(转移数据库架构和数据记录),但运行效率,大量数据的运行情况等都需要完善。另外,有了这个思路,可以做数据库备份,而且数据库备份数据库,可以导入到任何数据库中。呵呵,想想是不是这么回事?这个功能也应该花不了多少时间。有时间继续做做。
原文地址:https://www.cnblogs.com/asxinyu/p/2470838.html