本博客所有文章分类的总目录: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操作数据库的便利性和其通用性。数据库迁移功能已经实现了最基本的功能(转移数据库架构和数据记录),但运行效率,大量数据的运行情况等都需要完善。另外,有了这个思路,可以做数据库备份,而且数据库备份数据库,可以导入到任何数据库中。呵呵,想想是不是这么回事?这个功能也应该花不了多少时间。有时间继续做做。