利用XCode 20行代码搞定任何数据库的迁移
2012-04-26 08:28
399 查看
本博客所有文章分类的总目录: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
开源地址:http://xcode.codeplex.com/
前面2篇博客,使用Xcode进行了数据库反向工程以及自动向数据库插入测试数据的功能,其实上面的学习过程是为了今天的这个东西-数据库迁移工具。利用昨天的测试数据,今天将利用Xcode编写一段代码,进行数据库之间的转换和迁移,不仅包括数据库架构,同时包括数据库中的数据记录。下面记录一下开发过程:
2.不需要手动在外部数据库平台做任何事情,只需要修改数据库连接字符串,以及为了考虑转换速度,设置几个参数。
3.适用于任何2种数据库之间的迁移转换,据我所知,目前支持的数据库有:MSSQL,Mysql,Oracle,Access,Sqlite,PostgreSQL,Firebird等等,当然还有接口,给你最大的自由支持其他网络数据库。
4.数据库迁移包括数据库架构(表、字段等全部信息)和所有数据记录。
5.不需要生成实体类。
6.下一步开发数据库备份功能(备份数据库架构和数据记录),这样备份的数据可以导入到任何数据库中(这一点是不是也很强悍),这不是简单的导出SQL语句,毕竟导出的SQL,数据库之间通用性不那么高。
这些东西还不够吸引你吗?而上面的前5个功能,在Newlife.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 //思路:通过源数据库获取架构信息,然后反向工程,然后导出数据
DAL dal = DAL.Create(originConn);
List<IDataTable> tableList = dal.Tables;//获取源数据库的架构信息
tableList.RemoveAll(t => t.IsView);//过滤掉视图
//首先拷贝数据库架构
DAL desDal = DAL.Create(desConn);//要在配置文件中启用数据库架构才行
desDal.Db.CreateMetaData().SetTables(tableList.ToArray());
//然后依次拷贝每个表中的数据
foreach (var item in tableList)
{
//首先根据表名称获取当前表的实体操作接口
IEntityOperate Factory = dal.CreateOperate(item.Name);
//分页获取数据,并更新到新的数据库,通过更改数据库连接来完成
int allCount = Factory.FindCount ();
if (perCount < 0) perCount = GetDataRowsPerConvert (allCount );
int pages = (int)Math.Ceiling ((double)((double )allCount/(double )perCount));
for (int i = 0; i < pages ; i++)
{
Factory.ConnName = originConn;
IEntityList modelList = Factory.FindAll(string.Empty, string.Empty, string.Empty, i * perCount, perCount);
Factory.ConnName = desConn;
modelList.Insert(true);
}
Console.WriteLine("数据库{0} 数据转移完成!",item.Name );
}
}
/// <summary>
/// 根据数据表的记录总数来设置一个合理的每次转换数目。数据量大,一次性导出导入不合理
/// </summary>
/// <param name="allCount">数据表记录总数</param>
/// <returns>每次转换的记录数</returns>
private static int GetDataRowsPerConvert(int allCount)
{
if (allCount < 1000) return 200;
else if (allCount < 5000) return 500;
else if (allCount < 50000) return 1000;
else return 1500;
}
实现上面功能时出了点小问题,导致数据插入不了新数据库,因为我使用的是Save(),而不是Insert(),这2个东西还是有点差别,呵呵,多调试了2个小时,最后还是石头指出来的。
上面代码我测试了一下,从MSSQL 2005 迁移到 Mysql5.1,顺利完成。只测试了300条数据。也没有出现任何错误。应该算是没什么大问题,小问题的话,需要的人拿过去,修改下。这里只提供个思路,可以集成到自己的开发工具和应用软件中去,如加一个异步处理,多线程之类的。下一步打算做数据库备份,就是上面要求的最后一个,这个对于小型数据库来说,还是比较容易的,关键是大数据库有点难办,希望大家也给点意见啊。
4.改进
这几篇博客都只是一个思路,从中可以看出Xcode操作数据库的便利性和其通用性。数据库迁移功能已经实现了最基本的功能(转移数据库架构和数据记录),但运行效率,大量数据的运行情况等都需要完善。另外,有了这个思路,可以做数据库备份,而且数据库备份数据库,可以导入到任何数据库中。呵呵,想想是不是这么回事?这个功能也应该花不了多少时间。有时间继续做做。
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
开源地址:http://xcode.codeplex.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 //思路:通过源数据库获取架构信息,然后反向工程,然后导出数据
DAL dal = DAL.Create(originConn);
List<IDataTable> tableList = dal.Tables;//获取源数据库的架构信息
tableList.RemoveAll(t => t.IsView);//过滤掉视图
//首先拷贝数据库架构
DAL desDal = DAL.Create(desConn);//要在配置文件中启用数据库架构才行
desDal.Db.CreateMetaData().SetTables(tableList.ToArray());
//然后依次拷贝每个表中的数据
foreach (var item in tableList)
{
//首先根据表名称获取当前表的实体操作接口
IEntityOperate Factory = dal.CreateOperate(item.Name);
//分页获取数据,并更新到新的数据库,通过更改数据库连接来完成
int allCount = Factory.FindCount ();
if (perCount < 0) perCount = GetDataRowsPerConvert (allCount );
int pages = (int)Math.Ceiling ((double)((double )allCount/(double )perCount));
for (int i = 0; i < pages ; i++)
{
Factory.ConnName = originConn;
IEntityList modelList = Factory.FindAll(string.Empty, string.Empty, string.Empty, i * perCount, perCount);
Factory.ConnName = desConn;
modelList.Insert(true);
}
Console.WriteLine("数据库{0} 数据转移完成!",item.Name );
}
}
/// <summary>
/// 根据数据表的记录总数来设置一个合理的每次转换数目。数据量大,一次性导出导入不合理
/// </summary>
/// <param name="allCount">数据表记录总数</param>
/// <returns>每次转换的记录数</returns>
private static int GetDataRowsPerConvert(int allCount)
{
if (allCount < 1000) return 200;
else if (allCount < 5000) return 500;
else if (allCount < 50000) return 1000;
else return 1500;
}
实现上面功能时出了点小问题,导致数据插入不了新数据库,因为我使用的是Save(),而不是Insert(),这2个东西还是有点差别,呵呵,多调试了2个小时,最后还是石头指出来的。
上面代码我测试了一下,从MSSQL 2005 迁移到 Mysql5.1,顺利完成。只测试了300条数据。也没有出现任何错误。应该算是没什么大问题,小问题的话,需要的人拿过去,修改下。这里只提供个思路,可以集成到自己的开发工具和应用软件中去,如加一个异步处理,多线程之类的。下一步打算做数据库备份,就是上面要求的最后一个,这个对于小型数据库来说,还是比较容易的,关键是大数据库有点难办,希望大家也给点意见啊。
4.改进
这几篇博客都只是一个思路,从中可以看出Xcode操作数据库的便利性和其通用性。数据库迁移功能已经实现了最基本的功能(转移数据库架构和数据记录),但运行效率,大量数据的运行情况等都需要完善。另外,有了这个思路,可以做数据库备份,而且数据库备份数据库,可以导入到任何数据库中。呵呵,想想是不是这么回事?这个功能也应该花不了多少时间。有时间继续做做。
相关文章推荐
- 【备忘】windows环境下20行php代码搞定音频裁剪
- 【SSH】利用applicationContext.xml文件结合java代码生成项目所需的数据库
- 数据库分库分表(sharding)(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案
- 利用RMAN将数据库从文件系统迁移到ASM
- XCode读取Excel数据(适用于任何数据库)
- 利用Xcode GPU调试工具 找到渲染代码的BUG
- php利用数据库教程信息生成静态页面实例代码
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案
- 利用dbcp数据库连接池连接数据库,并利用dbtuils框架对数据库test中book表进行插入、删除、修改、查询的操作代码
- golang利用不到20行代码实现路由调度详解
- 利用单元测试在每个层上对 PHP 代码进行检查 在模块、数据库和 UI 层对 PHP 代码进行单元测试
- 利用Rational Rose进行C++代码和数据库结构分析
- 利用DB Link两步搞定Oracle两个数据库间的表同步
- mac系统中如何利用命令框里进行数据库迁移
- 利用mongosync做数据库迁移
- 利用Rational Rose进行C++代码和数据库结构分析
- Android 一行代码搞定将错误日志放入到sd卡中且不需要任何权限,适配到android7.0
- [ InfoPath应用场景:库存管理 ] 在InfoPath Form Service利用WSS Web Service技术,通过VSTA代码把复杂表单写入SharePoint列表数据库 (一)
- 转:一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】一周搞定