1 引言
近年来,国内许多高校逐步建立了网络基础设施,构建了一些应用系统。但由于缺乏对数字校园总体结构的认识,出现了系统构建各自为政,缺乏统一规划,已构建的系统互割裂,信息与资源无法共享,而有些系统则集成度过高、维护与升级困难,网络基础服务平台与应用系统脱节等问题。
在数字化校园的建设中,URP(University Resource Plan)概念的提出很好地解决了信息共享等问题。URP通过建立统一的数据库,制定统一的信息标准,使各种信息系统以松散耦合的方式集成起来,保障了数据的一致性、可靠性、可用性和安全性。原有系统中的历史数据,可以通过数据迁移的方式导入到新系统中。但在数据迁移的过程中,新的问题也随之而来。
2 数据迁移所面临的问题
目前,信息系统的开发大都是利用SQL Server、Oracle、Sybase等大型数据库,“数字化校园”建设中的数据库系统也大多采用这几种数据库。而Dbase、FoxBASE、FoxPro是我国近年来应用比较广泛的数据库开发软件,高校中仍有很多管理系统采用这种DBF格式的数据库。随着新系统的使用,原有系统中多年来积累的大量的宝贵的数据资料如何导入到新系统中,成为一个要解决的问题,也就是我们将面临如何将原始的数据迁移到新系统数据库中。
3 解决思路
统一数据库的主要目的是实现数据共享,保障数据的一致性。但不论是新的信息系统,还是原有的信息系统,每个系统的业务本身并没有发生本质的变化。因此在数据库的结构到数据方面,都可以保持基本一致,只是采用的数据库平台不同。另外,SQL Server自身提供的DTS(Data Transformation Services)工具,也包含了将Dbase、FoxBASE、FoxPro等旧格式数据库文件导入到SQL数据库的功能。
因此,根据实际的业务需求,利用ASP.NET所提供的数据库操作功能,配合SQL语句来编程,完全可以替代DTS的所有功能,从而实现大量的历史数据迁移至新的数据库系统中。
4 设计与实现
以全国高校毕业生就业管理系统为例,具体说明如何实现数据迁移功能。
原系统为教育部统一使用的单机版软件,采用FoxPro编写,并使用DBF格式文件存储数据。新系统是采用B/S结构,使用ASP.NET编写及SQL Server数据库存储数据。
在编写程序进行数据迁移的过程中需要解决以下几个问题:
(1) 原系统数据文件为DBF格式,在SQL Server中,DBF文件所在的文件夹被认为是一个数据库,DBF文件被认为是一个数据表。
(2) 数据迁移过程中,DBF文件可能存放在客户端,SQL Server数据库在服务器端,这需要将DBF文件先上传至服务器端再进行操作。
(3) 根据用户业务需求,数据迁移功能应包含初次迁移、追加数据、覆盖数据等功能。
4.1 DBF文件上传
传统的DBF格式数据文件,一般文件体积较小,因此采用ASP.NET提供的上传组件即可。对于上传文件类型,限定为.DBF格式。以上传学生基本信息表student.dbf为例,上传功能代码如下:
//判断文件大小是否为0
if (File1.PostedFile.ContentLength>0)
{
string fileExt=Path.GetExtension(File1.
PostedFile.FileName).ToLower();
//判断是否为DBF格式文件
if(fileExt!=”.dbf”)
{
//出错提示
Label1.Text=”只能上传dbf格式文件!!“;
}
//合法的非空的dbf文件
else
{
//指定上传目录
string filepath=Server.MapPath(”Data/”);
//上传至指定目录中
File1.PostedFile.SaveAs(filepath+
“student.dbf”);
//进行相关数据迁移操作
……
}
}
else
{
//出错提示
Label1.Text=”上传文件字节数为0!!“;
}
4.2 DBF文件导入
若在SQL Server数据库中不存在目标数据表,则使用导入并生成新表的命令。导入并建立新数据表功能代码如下:
//打开SQL Server数据库连接
myConnection.Open();
//filepath为DBF文件上传时定义的目标文件夹
//该语句将指定文件夹中的student.dbf文件
//导入至SQL Server的新建数据表student中
string creattb=”SELECT * INTO student FROM
Openrowset(’MSDASQL’,'Driver=Microsoft
Visual FoxPro Driver;SourceDB=”+filepath+”;
SourceType=DBF’, ’select* from student’)”;
//定义SQL命令
SqlCommand myComm=new SqlCommand(
creattb,myConnection);
//执行导入命令
myComm.ExecuteNonQuery();
//关闭数据库连接
myComm.Dispose();
myConnection.Close();
//操作成功提示信息
Label2.Text=”导入并生成学生数据表成功!!“;