□周相麗 □賀旭東
(1河南省信陽水文水資源勘測局;2河南省鄭州水文水資源勘測局)
基礎(chǔ)水文數(shù)據(jù)庫導(dǎo)入導(dǎo)出工具設(shè)計與實現(xiàn)分析
□周相麗1□賀旭東2
(1河南省信陽水文水資源勘測局;2河南省鄭州水文水資源勘測局)
在基礎(chǔ)水文數(shù)據(jù)庫維護過程中,經(jīng)常需要在不同的數(shù)據(jù)庫系統(tǒng)及其版本間導(dǎo)入導(dǎo)出數(shù)據(jù)。Visual Studio Integrated Development Environment提供了功能齊全的代碼編寫、編譯、調(diào)試等工具,支持C#語言,可以快速方便地創(chuàng)建和部署Web應(yīng)用程序、XML Web Services和傳統(tǒng)的客戶端應(yīng)用程序。文章設(shè)計了基礎(chǔ)水文數(shù)據(jù)庫導(dǎo)入導(dǎo)出工具,并使用Visual C#及ADO.NET、Oracle Managed Data Access組件開發(fā)實現(xiàn)。
基礎(chǔ)水文數(shù)據(jù)庫;水文數(shù)據(jù);ADO.NET
在實際水文整編和數(shù)據(jù)庫維護工作中經(jīng)常需要對數(shù)據(jù)庫中的水文原始、成果數(shù)據(jù)進行導(dǎo)入導(dǎo)出?,F(xiàn)有數(shù)據(jù)庫管理系統(tǒng)大多提供數(shù)據(jù)導(dǎo)入導(dǎo)出功能,可將數(shù)據(jù)庫及其對象從一個服務(wù)器實例移動或復(fù)制到另一個服務(wù)器實例。如Microsoft SQL Server提供SQL Server導(dǎo)入和導(dǎo)出向?qū)?DTSWizard.exe)及SQL ServerManagementStudio,Oracle提供 OracleSQL Developer。部分水文業(yè)務(wù)軟件亦提供不同數(shù)據(jù)庫之間不同站年、不同數(shù)據(jù)項目的數(shù)據(jù)遷移,如南方片水文資料整匯編軟件。不過有些應(yīng)用場景需要在不同的數(shù)據(jù)庫系統(tǒng)及其版本間遷移數(shù)據(jù),如SQL Server與Oracle之間及SQL Server 2000、2005、2008之間,這時需要更通用的程序?qū)崿F(xiàn)了。
.NET Framework數(shù)據(jù)提供程序(.NET Framework data provider)、Oracle托管數(shù)據(jù)訪問組件(Oracle Data Provider for.NET Managed Driver)提供.NET環(huán)境下對關(guān)系數(shù)據(jù)庫的訪問。NET Framework、Oracle數(shù)據(jù)提供程序包含4個核心對象,如表1所示。這些對象用于連接至數(shù)據(jù)源、執(zhí)行命令,提取數(shù)據(jù)集或更改數(shù)據(jù)源數(shù)據(jù)。
表1 數(shù)據(jù)提供程序核心對象表
3.1 用戶界面
工具是一個單文檔項目,程序界面簡潔,整個界面由菜單欄、TabContrl和ProgressBar組成。菜單欄包含文件、選項、查看及幫助四個菜單項。TabContrl包含兩個TabPage頁面,分別為首頁和數(shù)據(jù)維護頁面。首頁頁面由數(shù)據(jù)庫設(shè)置、數(shù)據(jù)路徑設(shè)置、文件列表和日志框構(gòu)成。數(shù)據(jù)維護頁面由備份數(shù)據(jù)庫設(shè)置、可選測站列表框、年份列表框、成果表類型列表框和同步按鈕構(gòu)成。
3.2 程序功能
基礎(chǔ)水文數(shù)據(jù)庫導(dǎo)入導(dǎo)出工具應(yīng)具有連接至數(shù)據(jù)庫功能,站年、數(shù)據(jù)項目類型選擇功能以及數(shù)據(jù)遷移功能等功能。
連接至數(shù)據(jù)庫功能:可選擇源數(shù)據(jù)庫及目的數(shù)據(jù)庫類型,如可選擇SQL Server或Oracle數(shù)據(jù)庫,輸入用戶名和口令后點擊連接按鈕連接至數(shù)據(jù)庫。
站年、數(shù)據(jù)項目類型選擇功能:可選擇需遷移的測站列表、資料年份和數(shù)據(jù)項目類型。數(shù)據(jù)項目類型包括《基礎(chǔ)水文數(shù)據(jù)庫表結(jié)構(gòu)及標(biāo)識符標(biāo)準(zhǔn)》所列的成果數(shù)據(jù)庫表結(jié)構(gòu)、南方片水文資料整匯編軟件定義的原始數(shù)據(jù)庫表結(jié)構(gòu)以及用戶自定義擴展的數(shù)據(jù)庫表結(jié)構(gòu)。主要數(shù)據(jù)庫表結(jié)構(gòu)如表2所示。
數(shù)據(jù)遷移功能:按用戶所選源、目的數(shù)據(jù)庫及站年、數(shù)據(jù)項目類型將數(shù)據(jù)從源服務(wù)器實例移動或復(fù)制到目的服務(wù)器實例。
表2 主要數(shù)據(jù)庫表結(jié)構(gòu)表
4.1 數(shù)據(jù)庫導(dǎo)入導(dǎo)出主要方法
①使用Sql(Oracle)Command、Sql(Oracle)DataAdapter和Sql (Oracle)Connection從源、目的數(shù)據(jù)庫中取得數(shù)據(jù)記錄,并分別填充至源、目的DataSet中。②比較源、目的DataSet中的記錄,并將較目的DataSet中新的記錄由源DataSet復(fù)制到目的DataSet。③使用目的DataSet的Sql(Oracle)DataAdapter.Update ()將修改過的目的DataSet記錄行返回目的數(shù)據(jù)庫。
4.2 實現(xiàn)步驟
4.2.1 連接至數(shù)據(jù)庫
使用 SQL、Oracle數(shù)據(jù)訪問組件提供的 Sql(Oracle) Connection類打開源、目的數(shù)據(jù)庫連接。SqlConnection連接字符串為:string.Format("Data Source={0};Pooling=false;User Id= {1};Password={2};",ORASRVR, UserId, Password);Oracle Connection連接字符串為:
string.Format("Data Source={0};Initial Catalog={1};User ID= {2};Password={3};",DataSource,InitialCatalog,UserID,Password)。
4.2.2 加載數(shù)據(jù)庫記錄集至DataSet
設(shè)置 Sql(Oracle)Parameter查詢參數(shù),調(diào)用 Sql(Oracle) DataAdapter的Fill方法將記錄填充至DataSet中。Sql(Oracle) DataAdapter的MissingSchemaAction屬性設(shè)置為MissingSchema Action.AddWithKey,以使Sql(Oracle)DataAdapter創(chuàng)建DataSet的架構(gòu)包括主鍵信息。
4.2.3 復(fù)制DataSet記錄并更新目的數(shù)據(jù)庫
DataSet為存放于內(nèi)存中的數(shù)據(jù)緩存,DataTable為內(nèi)存中的數(shù)據(jù)表。System.Data命名空間DataTable類提供Select()方法用以獲取DataRow對象數(shù)組。構(gòu)造適當(dāng)?shù)牟樵儽磉_式便可返回目的數(shù)據(jù)庫所需記錄,如查詢降雨量摘錄表過程主要語句可定義如下。
string expression=string.Format("STCD=‘{0}’and BGTM=‘{1}’ and ENDTM=‘{2}’",STCD,BGTM,ENDTM);DataRow []datarow=
dataset.Tables["TBL"].Select(expression)。待將查詢到的datarow復(fù)制至目的DataSet后,便可使用目的DataSet的Sql(Oracle) DataAdapter .Update()方法,將記錄更新至目的數(shù)據(jù)庫。為提高應(yīng)用程序的性能,Sql(Oracle)DataAdapter.UpdateBatchSize屬性可設(shè)置為0(表示服務(wù)器可處理的最大批大?。┗蛉我缓线m數(shù)據(jù)以減少批量更新服務(wù)器的次數(shù)。主要更新語句如下。
Sql(Oracle)DataAdapter.UpdateBatchSize=UpdateNumber;Sql (Oracle)DataAdapter.Update(DataSet,TableName);DataSet.ccept Changes();Sql(Oracle)Transaction.Commit()。
文章設(shè)計并實現(xiàn)了基礎(chǔ)水文數(shù)據(jù)庫導(dǎo)入導(dǎo)出工具。軟件界面簡潔、操作簡便,包括站年、數(shù)據(jù)項目類型選擇以及數(shù)據(jù)遷移等功能。借助本軟件,可以跨越數(shù)據(jù)庫系統(tǒng)和版本,在SQL Server、Oracle之間或同一數(shù)據(jù)庫管理系統(tǒng)不同版本之間任意導(dǎo)入導(dǎo)出數(shù)據(jù)。系統(tǒng)實現(xiàn)主要應(yīng)用Sql(Oracle) Connection、Sql(Oracle)Command、Sql(Oracle)DataAdapter等對象,讀者在文章基礎(chǔ)上不難構(gòu)建自己的數(shù)據(jù)庫導(dǎo)入導(dǎo)出軟件。
編輯:趙 鑫
P337
:B
:1673-8853(2017)02-0038-02
2016-11-16