1 引言
近年來,國(guó)內(nèi)許多高校逐步建立了網(wǎng)絡(luò)基礎(chǔ)設(shè)施,構(gòu)建了一些應(yīng)用系統(tǒng)。但由于缺乏對(duì)數(shù)字校園總體結(jié)構(gòu)的認(rèn)識(shí),出現(xiàn)了系統(tǒng)構(gòu)建各自為政,缺乏統(tǒng)一規(guī)劃,已構(gòu)建的系統(tǒng)互割裂,信息與資源無(wú)法共享,而有些系統(tǒng)則集成度過高、維護(hù)與升級(jí)困難,網(wǎng)絡(luò)基礎(chǔ)服務(wù)平臺(tái)與應(yīng)用系統(tǒng)脫節(jié)等問題。 在數(shù)字化校園的建設(shè)中,URP(University Resource Plan)概念的提出很好地解決了信息共享等問題。URP通過建立統(tǒng)一的數(shù)據(jù)庫(kù),制定統(tǒng)一的信息標(biāo)準(zhǔn),使各種信息系統(tǒng)以松散耦合的方式集成起來,保障了數(shù)據(jù)的一致性、可靠性、可用性和安全性。原有系統(tǒng)中的歷史數(shù)據(jù),可以通過數(shù)據(jù)遷移的方式導(dǎo)入到新系統(tǒng)中。但在數(shù)據(jù)遷移的過程中,新的問題也隨之而來。 2 數(shù)據(jù)遷移所面臨的問題 目前,信息系統(tǒng)的開發(fā)大都是利用SQL Server、Oracle、Sybase等大型數(shù)據(jù)庫(kù),“數(shù)字化校園”建設(shè)中的數(shù)據(jù)庫(kù)系統(tǒng)也大多采用這幾種數(shù)據(jù)庫(kù)。而Dbase、FoxBASE、FoxPro是我國(guó)近年來應(yīng)用比較廣泛的數(shù)據(jù)庫(kù)開發(fā)軟件,高校中仍有很多管理系統(tǒng)采用這種DBF格式的數(shù)據(jù)庫(kù)。隨著新系統(tǒng)的使用,原有系統(tǒng)中多年來積累的大量的寶貴的數(shù)據(jù)資料如何導(dǎo)入到新系統(tǒng)中,成為一個(gè)要解決的問題,也就是我們將面臨如何將原始的數(shù)據(jù)遷移到新系統(tǒng)數(shù)據(jù)庫(kù)中。 3 解決思路 統(tǒng)一數(shù)據(jù)庫(kù)的主要目的是實(shí)現(xiàn)數(shù)據(jù)共享,保障數(shù)據(jù)的一致性。但不論是新的信息系統(tǒng),還是原有的信息系統(tǒng),每個(gè)系統(tǒng)的業(yè)務(wù)本身并沒有發(fā)生本質(zhì)的變化。因此在數(shù)據(jù)庫(kù)的結(jié)構(gòu)到數(shù)據(jù)方面,都可以保持基本一致,只是采用的數(shù)據(jù)庫(kù)平臺(tái)不同。另外,SQL Server自身提供的DTS(Data Transformation Services)工具,也包含了將Dbase、FoxBASE、FoxPro等舊格式數(shù)據(jù)庫(kù)文件導(dǎo)入到SQL數(shù)據(jù)庫(kù)的功能。 因此,根據(jù)實(shí)際的業(yè)務(wù)需求,利用ASP.NET所提供的數(shù)據(jù)庫(kù)操作功能,配合SQL語(yǔ)句來編程,完全可以替代DTS的所有功能,從而實(shí)現(xiàn)大量的歷史數(shù)據(jù)遷移至新的數(shù)據(jù)庫(kù)系統(tǒng)中。 4 設(shè)計(jì)與實(shí)現(xiàn) 以全國(guó)高校畢業(yè)生就業(yè)管理系統(tǒng)為例,具體說明如何實(shí)現(xiàn)數(shù)據(jù)遷移功能。 原系統(tǒng)為教育部統(tǒng)一使用的單機(jī)版軟件,采用FoxPro編寫,并使用DBF格式文件存儲(chǔ)數(shù)據(jù)。新系統(tǒng)是采用B/S結(jié)構(gòu),使用ASP.NET編寫及SQL Server數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)。 在編寫程序進(jìn)行數(shù)據(jù)遷移的過程中需要解決以下幾個(gè)問題: (1) 原系統(tǒng)數(shù)據(jù)文件為DBF格式,在SQL Server中,DBF文件所在的文件夾被認(rèn)為是一個(gè)數(shù)據(jù)庫(kù),DBF文件被認(rèn)為是一個(gè)數(shù)據(jù)表。 (2) 數(shù)據(jù)遷移過程中,DBF文件可能存放在客戶端,SQL Server數(shù)據(jù)庫(kù)在服務(wù)器端,這需要將DBF文件先上傳至服務(wù)器端再進(jìn)行操作。 (3) 根據(jù)用戶業(yè)務(wù)需求,數(shù)據(jù)遷移功能應(yīng)包含初次遷移、追加數(shù)據(jù)、覆蓋數(shù)據(jù)等功能。 4.1 DBF文件上傳 傳統(tǒng)的DBF格式數(shù)據(jù)文件,一般文件體積較小,因此采用ASP.NET提供的上傳組件即可。對(duì)于上傳文件類型,限定為.DBF格式。以上傳學(xué)生基本信息表student.dbf為例,上傳功能代碼如下: //判斷文件大小是否為0 if (File1.PostedFile.ContentLength>0) { string fileExt=Path.GetExtension(File1. PostedFile.FileName).ToLower(); //判斷是否為DBF格式文件 if(fileExt!=”.dbf”) { //出錯(cuò)提示 Label1.Text=”只能上傳dbf格式文件??!“; } //合法的非空的dbf文件 else { //指定上傳目錄 string filepath=Server.MapPath(”Data/”); //上傳至指定目錄中 File1.PostedFile.SaveAs(filepath+ “student.dbf”); //進(jìn)行相關(guān)數(shù)據(jù)遷移操作 …… } } else { //出錯(cuò)提示 Label1.Text=”上傳文件字節(jié)數(shù)為0??!“; } 4.2 DBF文件導(dǎo)入 若在SQL Server數(shù)據(jù)庫(kù)中不存在目標(biāo)數(shù)據(jù)表,則使用導(dǎo)入并生成新表的命令。導(dǎo)入并建立新數(shù)據(jù)表功能代碼如下: //打開SQL Server數(shù)據(jù)庫(kù)連接 myConnection.Open(); //filepath為DBF文件上傳時(shí)定義的目標(biāo)文件夾 //該語(yǔ)句將指定文件夾中的student.dbf文件 //導(dǎo)入至SQL Server的新建數(shù)據(jù)表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); //執(zhí)行導(dǎo)入命令 myComm.ExecuteNonQuery(); //關(guān)閉數(shù)據(jù)庫(kù)連接 myComm.Dispose(); myConnection.Close(); //操作成功提示信息 Label2.Text=”導(dǎo)入并生成學(xué)生數(shù)據(jù)表成功??!“; 4.3 DBF文件追加 若SQL Server數(shù)據(jù)庫(kù)中已存在student數(shù)據(jù)表,則使用追加命令導(dǎo)入數(shù)據(jù)。追加數(shù)據(jù)功能代碼如下: //打開SQL Server數(shù)據(jù)庫(kù)連接 myConnection.Open(); //filepath為DBF文件上傳時(shí)定義的目標(biāo)文件夾 //該語(yǔ)句將指定文件夾中的student.dbf文件 //追加至SQL Server的數(shù)據(jù)表student中 string creattb=”INSERT INTO student SELECT * FROM Openrowset(’MSDASQL’, ‘Driver=Microsoft Visual FoxPro Driver; SourceDB=”+filepath+”; SourceType=DBF’,’select* from student’)”; //定義SQL命令 SqlCommand myComm=new SqlCommand( creattb,myConnection); //執(zhí)行導(dǎo)入命令 myComm.ExecuteNonQuery(); //關(guān)閉數(shù)據(jù)庫(kù)連接 myComm.Dispose(); myConnection.Close(); //操作成功提示信息 Label2.Text=”導(dǎo)入學(xué)生數(shù)據(jù)表成功??!“; 4.3 DBF文件覆蓋 若導(dǎo)入的數(shù)據(jù)需覆蓋SQL Server數(shù)據(jù)庫(kù)中原有數(shù)據(jù),則需先執(zhí)行刪除語(yǔ)句,再執(zhí)行導(dǎo)入語(yǔ)句。數(shù)據(jù)覆蓋功能代碼如下: //打開SQL Server數(shù)據(jù)庫(kù)連接 myConnection.Open(); //刪除SQL Server中student數(shù)據(jù)表內(nèi)容 string creattb=”delete from student”; //定義SQL命令 SqlCommand myComm=new SqlCommand (creattb,myConnection); //執(zhí)行刪除命令 myComm.ExecuteNonQuery(); //filepath為DBF文件上傳時(shí)定義的目標(biāo)文件夾 //該語(yǔ)句用指定文件夾中的student.dbf文件 //覆蓋SQL Server數(shù)據(jù)表student中的數(shù)據(jù) creattb=”INSERT INTO student SELECT * FROM Openrowset(’MSDASQL’, ‘Driver=Microsoft Visual FoxPro Driver; SourceDB=”+filepath+”; SourceType=DBF’,’select* from student’)”; //重新定義SQL命令 myComm.CommandText=creattb; //執(zhí)行導(dǎo)入命令 myComm.ExecuteNonQuery(); //關(guān)閉數(shù)據(jù)庫(kù)連接 myComm.Dispose(); myConnection.Close(); //操作成功提示信息 Label2.Text=”覆蓋學(xué)生數(shù)據(jù)表成功??!“; 從上面的代碼中,可以看出覆蓋操作被分解為刪除、追加兩步執(zhí)行。 類似的,也可以先刪除SQL Server中的student數(shù)據(jù)表,然后采用4.1的導(dǎo)入并生成數(shù)據(jù)表兩個(gè)操作來實(shí)現(xiàn)覆蓋數(shù)據(jù)。其中,刪除數(shù)據(jù)表可使用SQL 命令“DROP TABLE student”來實(shí)現(xiàn)。 5 結(jié) 語(yǔ) 在程序的可靠性、準(zhǔn)確性等方面,通過對(duì)數(shù)萬(wàn)條學(xué)生信息的遷移測(cè)試和校驗(yàn),數(shù)據(jù)的導(dǎo)入、追加、覆蓋等功能,完全達(dá)到了要求,能將原有的DBF數(shù)據(jù)文件準(zhǔn)確快速的導(dǎo)入到SQL Server數(shù)據(jù)庫(kù)中。 DBF數(shù)據(jù)遷移到SQL Server數(shù)據(jù)庫(kù)中的方法,為解決數(shù)據(jù)遷移中的穩(wěn)定性、安全性、準(zhǔn)確性等問題提供了有力的幫助,有效地解決了大量歷史數(shù)據(jù)的繼承問題。同樣,這種遷移方法只需替換相應(yīng)的SQL語(yǔ)句,即可用于MDB文件、EXCEL文件以及特定格式的文本文件等各種數(shù)據(jù)庫(kù)文件的數(shù)據(jù)遷移中 |
|