数据迁移记之数据库迁移
有道是“运筹帷幄之中 决胜千里之外”,我们先走访了两边门店,调查了一下目前的具体业务情况
我们针对客户的数据库需求,做了一个实施方案,内容如下:
根据目前XX健身中心业务需求,并加上我公司对健身中心两个门店的了解,做如下实施方案
1. XX店、XX店数据库截止到2011.5.18中午,两个数据库分别将会员信息转换到各自新系统的数据库内。5.18时间以后的数据全面核对录入新系统,
2. 导入数据库设计重号或因信息不全的会员卡号,由各门店安排相应人员从旧系统查询资料,补录入新系统。同时将常用的会员卡,分批逐步核对一下信息,以确保数据的准确无误。
3. 原有旧系统服务器转成客户端使用,以保证资料有不全时,便于查询核对,在原有服务器上安装新管理系统的客户端。同时安排人员对新旧系统的信息进行核对,以免有信息导入的疏漏。
4. 根据各门店职员的工作职能,同各门店主管经理一同设定新管理系统的操作员及管理权限。管理权限设定好后,对系统进行备份保存
5. 远程访问系统 根据需要设定 访问账号和密码  登陆相应的地址输入密码,可以看到对应门店的程序界面,输入账号和密码即可进入管理系统,进行相关操作、查询等。
6. 新系统的自动备份时间一般设定为2小时备份一次,也可以根据需要进行设定。为了保证数据备份安全,每个门店的服务器可以后期安装一个U盘,或连接指定的其他电脑,通过同步数据备份系统进行定时二次备份。数据可以每周或每月归档整理刻录光盘保存。
二.合并数据库
1. 分析数据库
客户的两个门店之前用的是两套不一样架构的管理软件。下面分别做一下说明:
一套是采用VB6开发的,采用的是Acess比较简陋,而且设计架构很松散,bug比较多,对会员卡重号、信息重复等没有限制,造成了很多问题……会员照片是存在数据库的,可能是因为程序设计的问题,调用数据很慢。
另外一个门店采用的是BS架构的程序,MS-SQL2000的数据库,整体比较规范,但是会员照片是存在一个目录下,采用的是查相对路径的设计对应客户的照片,容易造成照片丢失的问题。
而我们要做的是将两种数据库的整体数据,全面整理导入到新的管理系统,所以这样两个不同的数据库,对数据迁移工作多少带来了一些难度。
我们先将备份过来的的采用Acess的数据库的软件的数据拿过来进行分析——
这个软件的整体数据都存储到Acess的数据库的一个实例文件里面,实例文件就在程序文件夹里,是个mdb文件,但是做了加密处理,所以我们到了一个Acess文件的密码查看器的软件(百度一下,有很多),查到密码居然是123,怀着质疑的心情,我们打开数据库,按照提示输入密码,居然是对的!于是我们又采用“独占模式”打开这个数据库,把密码彻底删掉了,便于下来的数据库查看。
这个数据库编写的构架也有点热闹,像会员信息的表,居然是两个,但是又有区别,为下来我们要做的数据库导入加大了点难度。
2. 数据库测试导入(含语句实例)
SELECT *
INTO card FROM OPENDATASOURCE( 'Microsoft.Jet.OLEDB.4.0', 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\SunnySports.mdb;Persist Security Info=False')...card
insert into [mpjsf]..hyxx(id,hykh,hyxm,xmjm,xb,yddh,gddh,knje,jrrq,bzxx,jsr,yxts,klx,csrq,gly,yxcs,kkrq,dqrq) select id,cardnum,names,namespy,sex,mobile,tel,cprice,convert(varchar(50),accountsdate,20),content,adviser,datediff(day,validity,getdate()),types,dbo.fn_getbirday(birthday),'admin',ccounts,accountsdate,validity from [fitness]..fn_members
1) 数据库的整理导入
2) 日期的规范整理  Excle分列技术
3)
3. 导入照片(含语句实例)
4. 会员类型的合并
5.
照片由相对路径转换为二进制数据插入数据库(核心代码C#)
FileStream fs;
        byte[] bytes;
      DataSet1TableAdapters.tpTableAdapter();
        SqlConnection cn1 = new SqlConnection("Data Source=127.0.0.1;Initial      Catalog=Fitness;User ID=sa");
        DataSet2TableAdapters.Fn_MembersTableAdapter tpo = new        DataSet2TableAdapters.Fn_MembersTableAdapter();
        DataSet2 ds=new DataSet2();
        tpo.Fill(ds.Fn_Members);
        SqlCommand cmd1 = new SqlCommand();
        cmd1.Connection = cn1;
        cn1.Open();
        SqlParameter sp1 = new SqlParameter("@tp", SqlDbType.Binary);
        SqlParameter sp2 = new SqlParameter("@id", SqlDbType.Int);
        cmd1.Parameters.Add(sp1);
        cmd1.Parameters.Add(sp2);
drop table if exists admin        foreach (DataSet2.Fn_MembersRow d in ds.Tables[0].Rows)
        {
            string pt = @"c:\" + d.Photo;
            if (File.Exists(pt))
            {
fs = new FileStream(pt, FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);
            bytes = br.ReadBytes((int)fs.Length);
            cmd1.CommandText = "update  Fn_Members set tp=@tp where id=@id";
            sp1.Value = bytes;
            sp2.Value = d.Id;
            cmd1.ExecuteNonQuery();
            }
         
        }
        {
        }
        cn1.Close();