肖 希 (長江大學(xué)地球物理與石油資源學(xué)院,湖北 武漢430100)
劉 苗 (華工科技孝感產(chǎn)業(yè)園人力資源部,湖北 孝感432000)
隨著計算機信息技術(shù)的飛速發(fā)展和普及運用,加上政府、學(xué)校部門的大力宣傳推廣,無紙化辦公以其節(jié)能環(huán)保、跨地域、跨平臺的優(yōu)勢越來越受到公眾的接受和青睞。而在辦公自動化的系統(tǒng)中,工作人員多是使用微軟公司的Word編寫通知策劃、總結(jié)分析等電子文檔。因此,方便用戶閱讀、提交個人材料,實現(xiàn)Word文檔的網(wǎng)絡(luò)共享、安全可靠是提高辦公部門工作效能的重要方式之一。而這些操作通過現(xiàn)在比較成熟的數(shù)據(jù)庫技術(shù)即可實現(xiàn),在利用Delphi開發(fā)的人力資源管理信息系統(tǒng)中,將Word文檔以BLOB(Binary Large Object,二進制大對象)的形式存放在數(shù)據(jù)表的字段中,既可以避免C/S(客戶端/服務(wù)器)模式下文檔直接存放于磁盤中非法操作和壞道產(chǎn)生的不可逆錯誤[1],也可以提高文檔的存取速度。
下面,筆者通過對SQL Server 2000數(shù)據(jù)庫的操作封裝到開發(fā)者自定義的類中,先將文件流(FileStream)轉(zhuǎn)換為字符串 (String)存入文檔,讀取時再將字符串導(dǎo)出為文件流操作,并使用基于Delphi開發(fā)平臺提供的容器組件 (TOleContainer)載入文檔,達到高效管理Word文檔的目的。其中,著重介紹了Delphi自定義類Word文檔在數(shù)據(jù)庫 (人力資源管理信息系統(tǒng))中實現(xiàn)存、取功能應(yīng)用過程和方法。
越來越多的數(shù)據(jù)庫應(yīng)用程序都采用多層結(jié)構(gòu),其中三層結(jié)構(gòu)運用最為廣泛,即用戶界面層 (表示層)、業(yè)務(wù)層和數(shù)據(jù)連接層[2]。數(shù)據(jù)庫的操作邏輯處在中間層上,集中管理數(shù)據(jù)庫操作各類交互命令,從而使來自不同終端的客戶能夠使用同一個數(shù)據(jù)。針對這種情況,筆者將數(shù)據(jù)連接層和業(yè)務(wù)層封裝在自定義的類中,這樣編寫不僅能夠?qū)崿F(xiàn)大量代碼的復(fù)用功能,也降低了應(yīng)用程序在系統(tǒng)中的維護難度。
Object Pascal就是Delphi[3]實現(xiàn)面向?qū)ο蟮某绦蛟O(shè)計語言,具有可讀性好、容易編寫的特點,并提供了完整的編程機制支持面向?qū)ο蟪绦蛟O(shè)計,涵蓋了對象的封裝、繼承和多態(tài)等基本特性[4]。
Delphi自定義類就是程序員在Delphi中根據(jù)對象需求和特性自己創(chuàng)建的類,通常分為內(nèi)建類(Type類名=class(父類))和完全自定義類 (Type類名=object(父類)),主要是在內(nèi)存管理方式上的區(qū)別。由于完全自定義類在為構(gòu)造和析構(gòu)函數(shù)編寫代碼時需要為其分配、釋放內(nèi)存,難免使用到指針結(jié)構(gòu)這種較為復(fù)雜的編碼技術(shù),因而程序員大多數(shù)情況下使用自定義類的父類Delphi內(nèi)建類較為方便。筆者將自定義類封裝存放在自建的單元文件 (Unit)中,引用其他單元的類時,需要在接口 (interface)部分的uses后添加其他單元的名字或者在implementation之后使用uses語句添加亦可,并且需要在private和public中聲明不同級別權(quán)限的類成員。這種編碼方式極大的降低了代碼的維護難度,使代碼結(jié)構(gòu)清晰易讀,也提高了代碼的執(zhí)行速度。
BLOB的含義是巨大的不定的二進制或者字符型數(shù)據(jù),是在數(shù)據(jù)庫中存儲文檔 (比如Word、PDF等)、圖片以及可執(zhí)行文件數(shù)據(jù)的常用數(shù)據(jù)類型[5]。在MS SQL Server 2000數(shù)據(jù)庫中,通常以Image表示BLOB字段,但是在數(shù)據(jù)庫操作中并不能像其他的Char或者Int等字段直接讀、寫文件,而是需要在程序代碼中將需要存儲的文件與BLOB字符串流相互轉(zhuǎn)換存取。
Delphi集成開發(fā)環(huán)境提供了可基于TStream (流)技術(shù)來實現(xiàn)對數(shù)據(jù)庫中BLOB數(shù)據(jù)的操作[6],這些數(shù)據(jù)一般來自文件、數(shù)據(jù)庫、OLE對象等,TStream都提供了統(tǒng)一、簡潔的方法進行讀寫。
人力資源管理信息系統(tǒng)是典型的管理信息系統(tǒng) (Management Information System,MIS),涉及員工信息、考勤、工資等多個系統(tǒng)模塊。其中文檔維護模塊中的管理Word總結(jié)、策劃類型的文檔,對企劃活動、業(yè)務(wù)分析進行信息共享,有利于用戶單位的企業(yè)文化推廣和市場動態(tài)的調(diào)查研究。Word數(shù)據(jù)表中的數(shù)據(jù)類型也多種多樣,如變長字符數(shù)據(jù) (varchar)、時間數(shù)據(jù) (datetime)、二進制數(shù)據(jù) (image)等。由于Word文檔內(nèi)容的特殊性,需要經(jīng)過數(shù)據(jù)流轉(zhuǎn)換才能存儲到數(shù)據(jù)庫字段 (Image)中,因而在數(shù)據(jù)庫操作中對Image字段的存取是重點研究內(nèi)容。以下就以Delphi自定義類編碼實現(xiàn)Word文檔數(shù)據(jù)庫的存、取功能,描述自定義類在數(shù)據(jù)庫操作中的應(yīng)用效果。
在人力資源系統(tǒng)數(shù)據(jù)庫中建立表Doc_Table,主要用來存儲Word文檔的編號和內(nèi)容等信息,結(jié)構(gòu)如表1所示。Word文檔在系統(tǒng)中存、取的程序流程圖如圖1和圖2所示。
表1 Doc_Table文檔信息結(jié)構(gòu)表
圖1 “上傳 (存)”指令程序流程圖實例
圖2 “載入 (?。敝噶畛绦蛄鞒虉D實例
第1步 在信息系統(tǒng)的Project下點擊菜單命令 “File→New→DataModule”,將該單元的文件名保存為 “DataMod_unit”,此時會自動生成類TDataMod=class(TDataModule)。DataModule是專門用于放置數(shù)據(jù)庫訪問組件的框架,它提供了一種數(shù)據(jù)集中的管理方法,使用其不僅增加了數(shù)據(jù)組件的重用性,而且讓程序結(jié)構(gòu)更加明晰,使得不同的窗體使用同一張表時可以不必每個窗體都添加連接數(shù)據(jù)庫控件。在DataModule中添加控件并設(shè)置其屬性如表2所示。
第2步 編寫自定義類單元文件。單擊菜單命令“File→New→Uint”,并保存該單元文件名為 “Doc_Table_unit”。為完成該類的設(shè)計,需要在其中添加實現(xiàn) “添加”、“預(yù)覽”、“修改”、“刪除”等函數(shù)和過程代碼。筆者著重介紹了Word文檔的讀、寫方法,以下是在 “Doc_Table_unit”中實現(xiàn)Doc_Table操作的主要過程和函數(shù),其中必須先聲明的該類名為TDoctable=class(TObject),并在私有成員中聲明數(shù)據(jù)庫連接類Datamod:TDataMod。該單元文件中實現(xiàn)存、取功能的主要是GetDoc FromFile、WordId、RecUpdate、GetDoc 4個函數(shù):GetDocFromFile函數(shù)將Word文件流讀入變量參數(shù)ReturnString字符串,再返回給GWordUnit(文檔維護界面單元)中的FileTemp;WordId函數(shù)在Doc_Table表中先插入新導(dǎo)入的Doc_Id(編號)和Doc_Blob(Word二進制內(nèi)容);Doc_Id函數(shù)按條件查詢的方式調(diào)用RecUpdate更新其他字段的值信息;GetDoc函數(shù)中根據(jù)文檔編號讀出Word的數(shù)據(jù)流,可將其存放于本地臨時路徑Temppath,提交后該文件即可加載到主界面的Ole-Container容器。
表2 DataModule數(shù)據(jù)庫連接類中的控件及屬性
完成數(shù)據(jù)表操作類的設(shè)計后,在新建的 “文檔維護界面”窗體DocMangementFrm中的添加操作控件并設(shè)置屬性,主要控件及屬性如表3所示。在DocMangementFrm中要調(diào)用類來實現(xiàn) “上傳”(寫)、“載入”(讀)的功能,必須在DocMangementFrm的單元文件GWordUnit的uses中添加Doc_Table_unit類文件,并且在private中聲明該類的實例名為Doc_Table;同時在調(diào)用類的開始時實例化該類,使用結(jié)束后釋放該類的實例。由于在自定義類單元文件 “Doc_Table_unit”中已經(jīng)將對文檔的所有操作進行了封裝,因此只需要在事件代碼中創(chuàng)建實例“Doctable=TDoctable.create”后調(diào)用其 “存、取”成員函數(shù)便可實現(xiàn)指令響應(yīng)。
表3 窗體DocMangementFrm中的主要控件及屬性
采用合理的數(shù)據(jù)結(jié)構(gòu)和算法編碼是提高Word文檔在數(shù)據(jù)中的存取管理效率的關(guān)鍵因素,其中流技術(shù)是程序的核心,Delphi中創(chuàng)建的自定義類引導(dǎo)了程序的所有數(shù)據(jù)操作。圖3是在Delphi 7環(huán)境下調(diào)試通過的人力資源管理系統(tǒng)中文檔維護模塊運行的界面。雙擊Word詳情區(qū)便可瀏覽、編輯文檔全文信息,真正達到了工作文檔的高效管理、資源共享的目的。
圖3 人力資源管理系統(tǒng)中文檔維護模塊運行的界面 (實線圈定部分為存、取功能區(qū))
Word文檔是目前辦公室應(yīng)用越來越廣泛的通用文檔格式[7],企、事業(yè)單位中各種企劃、總結(jié)、通知等文檔需要歸檔供后續(xù)工作參考,因此對文檔進行電子化數(shù)據(jù)庫管理對提高工作質(zhì)量和效率具有積極的現(xiàn)實意義。筆者提出的Delphi自定義類在Word文檔數(shù)據(jù)庫中的應(yīng)用方法,能夠解決文檔在磁盤下直接存儲的不穩(wěn)定性問題,提高了代碼的可復(fù)用性和執(zhí)行效率,同時也減少了系統(tǒng)資源的耗費,并且對用戶指令反應(yīng)迅速,交互性強,適于在具有大量數(shù)據(jù)的數(shù)據(jù)庫系統(tǒng)中廣泛應(yīng)用。
[1]何紹木 .Delphi實現(xiàn) Word文檔在數(shù)據(jù)庫中的存取 [J].微型電腦應(yīng)用,2002,18(10):52-53.
[2]求是科技 .Delphi程序設(shè)計與開發(fā)技術(shù)大全 [M].北京:人民郵電出版社,2006,619-620.
[3]童愛紅,張綺,胡光斌 .Delphi 7應(yīng)用教程 [M].北京:清華大學(xué)出版社,2004:2-3.
[4]劉俊,石林,徐守坤,朱正偉 .Delphi程序設(shè)計教程 [M].第2版 .北京:清華大學(xué)出版社,2008,337-338.
[5]楊洪雪 .基于BLOB類型的數(shù)據(jù)庫圖像存取技術(shù) [J].數(shù)據(jù)庫及信息管理,2007,卷 (17):1231-1353.
[6]啟明工作室 .Delphi+SQL Server數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)與實例 [M].北京:人民郵電出版社,2005,110-111.
[7]郭興吉.Word文檔流技術(shù)研究與實踐 [J].綿陽師范學(xué)院學(xué)報,2010,29(11):85-86.