楊 婕
(山西中醫(yī)學(xué)院醫(yī)藥管理學(xué)院 山西 030024)
在實際應(yīng)用中,用戶需要設(shè)計出基于后臺數(shù)據(jù)庫的表單。開發(fā)人員將表單按照用戶的需求設(shè)計在固有的系統(tǒng)中,可以在短時間內(nèi)滿足特定用戶的需求。但是隨著用戶需求的改變,固定在系統(tǒng)中的表單可以導(dǎo)致可重用性差,可擴展性低,維護成本高等問題。
為了滿足用戶的不斷變化的業(yè)務(wù)需求,設(shè)計一種表單設(shè)計器成為一種需求。XML(eXtensible Markup Language)作為一種可擴展標記語言,具備良好的自描述性和擴展性,以及對多語言的支持等特點。設(shè)計開發(fā)基于XML的表單設(shè)計器構(gòu)件,以XML作為表單存儲形式,由用戶根據(jù)自身需求設(shè)計和管理基于后臺數(shù)據(jù)庫的表單,能很好的滿足用戶的需求,增強系統(tǒng)的可重用性,減少維護成本。
本系統(tǒng)所提供的表單設(shè)計器功能有:用戶可以在表單設(shè)計界面設(shè)計票據(jù),將設(shè)計的票據(jù)以XML文件的形式存儲,生成與票據(jù)對應(yīng)的后臺數(shù)據(jù)庫;可以解析識別生成的XML文檔。本系統(tǒng)主要有兩個大模塊:表單設(shè)計和解析XML文檔,其中表單設(shè)計模塊包含表單設(shè)計界面,轉(zhuǎn)化生成XML文檔和生成數(shù)據(jù)庫表3個模塊。
(1)靈活的界面設(shè)計。初始化界面時可由用戶確定表單和票據(jù)的大小,并根據(jù)用戶設(shè)定形成一個設(shè)計界面的網(wǎng)格背景。用戶在設(shè)計表單的過程中可以根據(jù)需要靈活的調(diào)節(jié)網(wǎng)格大小。
(2)表單設(shè)計的過程中給表項指定屬性,用以確定票據(jù)表項在后臺數(shù)據(jù)庫中對應(yīng)的字段類型。
(3)用戶可添加任意個數(shù)的表項和與之對應(yīng)的表項內(nèi)容。
用戶設(shè)計表單時,需為設(shè)計的表項確定數(shù)據(jù)類型,以確定后臺數(shù)據(jù)庫中的字段類型。該表單設(shè)計器為用戶提供了五種數(shù)據(jù)類型,分別是:默認性、數(shù)字型、日期型、固定型和自增型。
若用戶不指定數(shù)據(jù)類型或指定為默認類型,在創(chuàng)建表時默認其為字符型,用戶可以給其設(shè)置綁定默認值。用戶指定這些類型,記錄在動態(tài)的屬性數(shù)組里,在創(chuàng)建數(shù)據(jù)庫表的時候?qū)⑵鋵?yīng)到數(shù)據(jù)庫的表字段類型并在XML文檔中記錄這些信息。用戶還可以將設(shè)計的表項內(nèi)容綁定到相應(yīng)的表項,在用戶使用該表單時,表項內(nèi)容中添加的數(shù)據(jù)必須是表項屬性中設(shè)定的數(shù)據(jù)類型,否則,有在數(shù)據(jù)庫中出現(xiàn)不合規(guī)定數(shù)據(jù)的可能。
XML本身僅僅是一種存儲表單形式,并不能與應(yīng)用程序進行交互。要實現(xiàn)與應(yīng)用程序的交互,存儲數(shù)據(jù)時就需要用XML解析器來解析XML文檔。解析器分析XML文檔的組成結(jié)構(gòu)大致采用兩種模型:線性模型和樹模型。構(gòu)造過程自頂向下。本系統(tǒng)采用DOM(Document Object Model,文檔對象模型)模型來解析和生成XML文檔。
DTD文檔可看作一個或多個XML文件的模板。XML文件中的元素,即我們所創(chuàng)建的標記,是根據(jù)實際情況來創(chuàng)建的。本系統(tǒng)所生成的XML文檔也是遵從給定的DTD文檔的。
按照給定的DTD文檔,用獲取的動態(tài)數(shù)組與頁面信息創(chuàng)建存儲表單的XML文件。流程圖如圖1所示。
圖1 創(chuàng)建xml文檔的流程圖
創(chuàng)建XML后將在指定的路徑下生成一個XML文件,文件名由用戶輸入。如圖2所示(生成一個user.xml文件,文件名user由用戶輸入)。
用戶設(shè)計好頁面之后,不僅要有創(chuàng)建存儲表單信息的XML文檔,還要創(chuàng)建出與表單上的表項對應(yīng)的后臺數(shù)據(jù)庫表。因此必須在本系統(tǒng)中動態(tài)生成數(shù)據(jù)庫表,且生成的數(shù)據(jù)庫表必須與設(shè)計好的界面綁定。使用ADOX技術(shù)可以在數(shù)據(jù)庫中動態(tài)的創(chuàng)建數(shù)據(jù)庫表。
根據(jù)獲取的頁面信息,來創(chuàng)建后臺數(shù)據(jù)庫表,創(chuàng)建的過程大致如下:
(1)創(chuàng)建ADOX的Catalog對象,(Dim tabl As New ADOX.Catalog)。連接數(shù)據(jù)庫的搜索引擎,創(chuàng)建數(shù)據(jù)庫連接,連接到指定數(shù)據(jù)庫。
圖2 系統(tǒng)生成的XML文件示例
(2)創(chuàng)建ADOX的Table對象,獲取Table的表名,用于在指定數(shù)據(jù)庫中創(chuàng)建一個表。
(3)重新聲明全局的存放表項屬性信息的動態(tài)屬性數(shù)組。
(4)用ADOX的Append(Columns)方法,將新的 字段Column 對象添加到 Columns 集合中。
(5)創(chuàng)建新的表。將創(chuàng)建的新table對象添加到Catalog集合中。
數(shù)據(jù)庫表創(chuàng)建成功之后,會在access指定的數(shù)據(jù)庫中生成一個數(shù)據(jù)庫表。
本系統(tǒng)XML文檔的解析,是按照給定DTD文檔解析的。若要使用本系統(tǒng)所設(shè)計的表單,只需根據(jù)本系統(tǒng)所提供的DTD文檔寫出相應(yīng)的解析程序即可。解析過程大致如下:
(1)加載要解析的XML文檔。
(2)若table節(jié)點不為空,獲取其lnum與tnum這兩個屬性的信息。否則結(jié)束。
(3)重新聲明用于存放屬性的動態(tài)類型數(shù)組。用以存放解析的信息。
(4)遍歷所有的row節(jié)點,將節(jié)點信息存放在row類型的數(shù)組里。
(5)遍歷所有的text節(jié)點,將節(jié)點信息存放在text類型的數(shù)組里。
(6)根據(jù)解析的信息在不同的系統(tǒng)中生成相應(yīng)的表單。
目前系統(tǒng)已經(jīng)可以識別用戶創(chuàng)建的表單,并將其解析成XML文檔和在后臺創(chuàng)建與之對應(yīng)數(shù)據(jù)庫表,很好的解決了固定在系統(tǒng)中的表單導(dǎo)致的可重用性差,可擴展性低,維護成本高等問題。
[1]王瑞霞 .基于XML的表單設(shè)計器構(gòu)件的設(shè)計與實現(xiàn)[J].計算機應(yīng)用研究.2007,27(7)
[2]Jake Strurm .開發(fā)XML解決方案[M].北京大學(xué)出版社
[3]Brett McLaugblim .Java 與 XML 數(shù)據(jù)綁定[M].中國電力出版社
[4]史勝利.VB中數(shù)據(jù)庫編程時使用ADOX創(chuàng)建對象[J].陰山學(xué)刊.2007.03