利用XCode 20行代码搞定任何数据库的迁移
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html
Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html
QQ群:1600800
博客:http://nnhy.cnblogs.com
论坛:http://www.53wb.com
1.为什么要进行数据库迁移
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行左右。如下所示,有注释:
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 < 1000) return 200;
44 else if (allCount < 5000) return 500;
45 else if (allCount < 50000) return 1000;
46 else return 1500;
47 }
实现上面功能时出了点小问题,导致数据插入不了新数据库,因为我使用的是Save(),而不是Insert(),这2个东西还是有点差别,呵呵,多调试了2个小时,最后还是石头指出来的。
这几篇博客都只是一个思路,从中可以看出Xcode操作数据库的便利性和其通用性。数据库迁移功能已经实现了最基本的功能(转移数据库架构和数据记录),但运行效率,大量数据的运行情况等都需要完善。另外,有了这个思路,可以做数据库备份,而且数据库备份数据库,可以导入到任何数据库中。呵呵,想想是不是这么回事?这个功能也应该花不了多少时间。有时间继续做做。
.NET数据挖掘与机器学习,作者博客: http://www.cnblogs.com/asxinyu
E-mail:1287263703@qq.com