張桂平
(連云港杰瑞深軟科技有限公司,江蘇 連云港 222006)
隨著信息化建設(shè)的迅速發(fā)展,可利用的信息日益增多,在大型電子信息系統(tǒng)中,龐大的、各式各樣的數(shù)據(jù)需要在平臺中展示和維護。如果按照每個庫表結(jié)構(gòu)單獨進行靜態(tài)設(shè)計表單界面,對于成百上千的表而言,界面的排版工作量之大,產(chǎn)生界面和代碼文件之多,必然導致出錯率隨之增高,而且還不便于維護。而一般經(jīng)常使用的數(shù)據(jù)類型是文本型、字符串型、時間型、數(shù)值型這4種類型的數(shù)據(jù),在界面的顯示方式主要使用一般編輯框、下拉框型編輯框、時間型編輯框和文本編輯框這幾種控件。如果遇到如OraclE中的BLOB、RAW等字段類型,則可以另行再作特殊處理,當然,也可以按照本文所介紹的實現(xiàn)方法另外開發(fā)一類含有BLOB或RAW型數(shù)據(jù)的通用表單頁面。
從數(shù)據(jù)類型著手,可以通過從元數(shù)據(jù)中直接取得數(shù)據(jù)的類型、長度及其他相關(guān)描述信息,編寫代碼執(zhí)行后,動態(tài)產(chǎn)生表單頁面,這樣不僅能提高軟件的開發(fā)效率,降低軟件運行的出錯率,提高軟件的復(fù)用率,而且還能使系統(tǒng)更加人性化,例如用戶可以自己通過調(diào)整元數(shù)據(jù)的有關(guān)信息,得到想要的表單設(shè)計頁面。而如何通過調(diào)用統(tǒng)一接口,利用元數(shù)據(jù)中對原始數(shù)據(jù)的描述信息,按照一定規(guī)則自動生成表單是本文討論所要介紹的重點內(nèi)容。
一般認為,元數(shù)據(jù)是關(guān)于數(shù)據(jù)的數(shù)據(jù),但這種定義還是過于簡單和籠統(tǒng)。實際上,在不同領(lǐng)域?qū)ν粋€數(shù)據(jù)會用不同的元數(shù)據(jù)來進行描述。在數(shù)據(jù)倉庫領(lǐng)域中,元數(shù)據(jù)包括記錄數(shù)據(jù)項的業(yè)務(wù)描述信息,能支持系統(tǒng)對數(shù)據(jù)的管理和維護;在軟件構(gòu)造領(lǐng)域中,元數(shù)據(jù)則被定義為通過其數(shù)據(jù)的修改來改變程序的行為的數(shù)據(jù)。本文所指的元數(shù)據(jù)類似于軟件構(gòu)造領(lǐng)域中的元數(shù)據(jù),比如通過修改元數(shù)據(jù)中是否隱藏、選擇控件類型、頁面數(shù)、列擺放數(shù)等內(nèi)容,在代碼執(zhí)行時,會調(diào)用這些信息來得到不同的結(jié)果。
本文所介紹的通用表單動態(tài)生成技術(shù)建立在元數(shù)據(jù)基礎(chǔ)之上,主要步驟如下:
(1)建立元數(shù)據(jù)庫表結(jié)構(gòu),記錄數(shù)據(jù)庫中各庫表的信息,包括數(shù)據(jù)庫類型、表名、字段名、字段標題、字段類型、字段大小、是否為空、是否唯一、引用值、缺省值等庫表本身信息,這些信息只需從庫表字典中提取即可,無需手工輸入。在此基礎(chǔ)上再添加序號、是否只讀、控件類型、是否隱藏、列擺放數(shù)等屬性信息,這幾個信息根據(jù)需要可進行手工設(shè)置。
(2)設(shè)計公用表單界面,即用戶通過接口函數(shù)中的表名,提取元數(shù)據(jù)中庫表相應(yīng)的信息,按照一定的規(guī)則創(chuàng)建表單界面。表單界面如何設(shè)計是關(guān)鍵,即根據(jù)元數(shù)據(jù)所記錄的庫表信息結(jié)合一定的約束條件來進行設(shè)計,例如根據(jù)元數(shù)據(jù)中的“數(shù)據(jù)庫類型”選擇相應(yīng)的數(shù)據(jù)源連接接口,計算所要顯示的字段個數(shù)和控件類型來設(shè)計界面的大小。其中,控件類型主要分編輯控件、下拉框控件、時間編輯控件及文本框控件4種類型,也是界面產(chǎn)生哪類控件的依據(jù)。另外,用戶可根據(jù)元數(shù)據(jù)中序號來設(shè)置界面中字段擺放的次序和位置,而列擺放數(shù)分為1、2、3種類型,表示表單界面編輯框一行所要放置的個數(shù)。
(3)依據(jù)數(shù)據(jù)庫類型選取數(shù)據(jù)庫連接方式,如果使用的是Oracle數(shù)據(jù)庫,則可以用Oracle的第三方控件連接數(shù)據(jù)庫的方式;如果使用的是SQLServer數(shù)據(jù)庫,則可使用ODBC連接方式。利用元數(shù)據(jù)可以將幾種異構(gòu)數(shù)據(jù)庫有機地集成在一起,然后各自讀取相應(yīng)庫表中的數(shù)據(jù),并將數(shù)據(jù)暫存于DATASET中,再根據(jù)控件所關(guān)聯(lián)庫表中的字段名在界面中顯示相應(yīng)的數(shù)據(jù),也可以通過增加、修改功能進行數(shù)據(jù)維護。通過統(tǒng)一接口函數(shù)中所提供的數(shù)據(jù)源類型、表名、唯一索引值和是否增加狀態(tài)來讀取庫表中的數(shù)據(jù),并對數(shù)據(jù)進行維護和提交。
具體流程如圖1所示。
通用表單是依據(jù)元數(shù)據(jù)中所提供的信息而產(chǎn)生的,因此,在生成表單之前,必須建全元數(shù)據(jù)中的信息。
圖1 通用表單實現(xiàn)流程圖
在Oracle數(shù)據(jù)庫中,建立元數(shù)據(jù)表結(jié)構(gòu)來存放各源數(shù)據(jù)表的信息和其它一些屬性信息,主要包括列名、列標題、數(shù)據(jù)類型、不能為空、缺省值、隱藏、數(shù)據(jù)長度、是否主鍵、是否唯一、數(shù)據(jù)精度、唯一性索引名稱、只讀、引用id、列擺放數(shù)、控件類型、序號等內(nèi)容。為了便于用戶使用,需要對元數(shù)據(jù)的定義單獨開發(fā)一個模塊,供用戶從數(shù)據(jù)庫系統(tǒng)中提取源數(shù)據(jù)信息,并設(shè)置一些表單界面所需要的信息。具體的實現(xiàn)方法與普通維護庫表數(shù)據(jù)類似,其界面布局如圖2所示。
圖2 元數(shù)據(jù)定義界面
首先靜態(tài)創(chuàng)建一個公用表單窗體,上面只需放置DATASET控件和DATASOURCE控件,而表單界面所擺放的控件及數(shù)據(jù)顯示功能都通過代碼執(zhí)行來動態(tài)生成。
DATASET可當成內(nèi)存中的數(shù)據(jù)庫,它是不依賴于數(shù)據(jù)庫的獨立數(shù)據(jù)集合,只需根據(jù)接口所傳的數(shù)據(jù)表名進行動態(tài)綁定源數(shù)據(jù)表,即可提取庫表中的數(shù)據(jù)暫存于其中,作為數(shù)據(jù)源數(shù)據(jù)本地的一個副本。
表單生成代碼設(shè)計時,表單界面設(shè)置的高度、寬度依據(jù)顯示字段的個數(shù)、類型和元數(shù)據(jù)中列擺放數(shù)來確定的。如設(shè)置一行編輯框控件(包括時間編輯框、下拉框)的高度是35像素,文本框的高度是200像素,界面的大小可根據(jù)列擺放數(shù)、顯示的編輯框數(shù)、文本框數(shù)來計算表單界面的高度,本文所使用的編輯框控件是復(fù)合控件,將label與平常所用的數(shù)據(jù)庫控件集成在一起的,使用時只需綁定數(shù)據(jù)源的列名,label的caption值就會自動獲取列標題。主要算法如下:
代碼執(zhí)行后生成表單界面效果如圖3所示。
圖3 動態(tài)生成表單界面
在生成通用表單界面時,通過上一個界面?zhèn)鬟^來的標識參數(shù)來設(shè)置該表單處于增加或修改狀態(tài)。在表單生成后,對表單界面上的各欄目數(shù)據(jù)進行維護時,只要數(shù)據(jù)沒有提交,這些數(shù)據(jù)都存放于DATASET中,系統(tǒng)會根據(jù)元數(shù)據(jù)中所提供字段的是否為空、是否唯一、數(shù)據(jù)精度等屬性對輸入的數(shù)據(jù)進行合法性判斷,無需通過數(shù)據(jù)庫系統(tǒng)中返回的約束條件或錯誤信息進行判斷,這樣更能提高程序的執(zhí)行效率。操作保存功能按鈕后,才由DATASET提交給數(shù)據(jù)庫系統(tǒng)。
在大型信息系統(tǒng)中,面對大量的各類數(shù)據(jù)在平臺中進行展示、維護是一個必不可少的重要功能。如今元數(shù)據(jù)的運用在各個領(lǐng)域越來越深入,本文通過元數(shù)據(jù)提供的源數(shù)據(jù)信息和自設(shè)置屬性來實現(xiàn)源數(shù)據(jù)庫中的數(shù)據(jù)在通用表單中展示、維護的功能。通用表單動態(tài)生成技術(shù)的使用,不但能大大減少軟件設(shè)計的工作量,簡化了代碼的編寫,也大大地減少了軟件文件的大小,而且還能提高軟件的可靠性和可維護性。
如果數(shù)據(jù)表的字段特別多,一個頁面排列不下時,可在元數(shù)據(jù)中再增加“頁面數(shù)”屬性,讓數(shù)據(jù)進行分頁顯示,具體實現(xiàn)方法類似,在界面中增加PAGE控件,讓編輯框控件的父類指向PAGE頁即可。
[1]Jack Melnick.Oracle Call Interface Programmer’s Guide,10g Release 2(10.2)[EB/OL].http://docs.oracle.com/cd/B19306_01/appdev.102/b14250/toc.htm,2005-11-01.
[2][美]Scott Mitchell,Steve Walther.ASP.NET 權(quán)威指南[M].湯濤譯.北京:中國電力出版社,2011.
[3]岳慶生.Delphi高級編程指南[M].北京:清華大學出版社,2010.
[4]蔡昭權(quán),盧慶武,鄭宗暉,等.基于元數(shù)據(jù)的快速開發(fā)平臺設(shè)計與實現(xiàn)[J].計算機工程,2009,35(9):60-62.
[5]站長之家用戶.Openbiz技術(shù)開發(fā)手冊之Metadata元數(shù)據(jù)[EB/OL].http://www.chinaz.com/web/2012/0412/245481.shtml,2012-04-12.
[6]博客園.Oracle date類型字段處理的功能介紹[EB/OL].http://www.bitscn.com/pdb/oracle/201004/184032.html,2010-04-08.
[7]路川,胡欣杰,閻文麗.Oracle 10g寶典(2版)[M].北京:電子工業(yè)出版社,2010.
[8]黃正宏.數(shù)據(jù)庫查詢優(yōu)化的有效措施研究[J].信息與電腦:理論版,2011(11):15-20.
[9]彭丹.分布式元數(shù)據(jù)管理[J].現(xiàn)代計算機:下半月版,2007(8):58-59.
[10]Ray Liscbner.Delphi技術(shù)手冊[M].北京:中國電力出版社,2009.
[11]Eric Harmonr.Delphi COM深入編程[M].北京:機械工業(yè)出版社,2006.
[12]Eric Harmonr.Delphi/Klyix數(shù)據(jù)庫開發(fā)[M].北京:機械工業(yè)出版社,2008.
[13]賽迪網(wǎng)—軟件世界.元數(shù)據(jù)管理——企業(yè)信息化發(fā)展建設(shè)的潤滑劑[EB/OL].http://www.cnetnews.com.cn/2008/0915/1127082.shtml,2008-09-15.
[14]Sno_hite.元數(shù)據(jù)的概念及作用[EB/OL].http://rsjy.org/3329.html,2012-09-02.