醫(yī)院信息系統(tǒng)數(shù)據(jù)庫維護工具的開發(fā)
何遠源①
①中山市人民醫(yī)院計算機管理中心,528403,廣東省中山市孫文東路2 號
摘 要 為了提高醫(yī)院信息系統(tǒng)數(shù)據(jù)庫維護的工作效率,減少對數(shù)據(jù)庫執(zhí)行操作時的風險,
開發(fā)一個數(shù)據(jù)庫維護工具,對數(shù)據(jù)庫表的查詢、新增、刪除、修改操作集中在一個更具體、
直觀的窗體界面上,盡可能避免因sql語句錯誤導致數(shù)據(jù)破壞。
關鍵詞 數(shù)據(jù)庫維護 表結(jié)構(gòu)分析 生成 系統(tǒng)關聯(lián)
1 前言
根據(jù)《中國醫(yī)院信息化發(fā)展研究報告(白皮書)》,調(diào)查發(fā)現(xiàn)目前醫(yī)院信息
系統(tǒng)建設高速發(fā)展背后伴隨的是技術人才短缺,醫(yī)院信息系統(tǒng)應用開發(fā)自主創(chuàng)新
能力不強,具有自主知識產(chǎn)權產(chǎn)品很少,大部分醫(yī)院采用市場提供的信息系統(tǒng)產(chǎn)
品并有系統(tǒng)供應商實施建設工程,醫(yī)院自主應用管理與運行維護[1]。作為醫(yī)院信
息維護的員工對購買系統(tǒng)的數(shù)據(jù)庫結(jié)構(gòu)并不完全了解和熟悉,存在人為失誤導致
數(shù)據(jù)破壞的風險。本系統(tǒng)是一個醫(yī)院信息系統(tǒng)數(shù)據(jù)庫維護工具,通過對數(shù)據(jù)庫表
結(jié)構(gòu)的分析,把平時書寫的數(shù)據(jù)庫基本語句轉(zhuǎn)換為簡單、直觀的窗體界面操作。
2 必要性
日常的數(shù)據(jù)庫維護,對表進行查詢,增加,修改,刪除是使用最為頻繁的基
本操作,而條件語句在其中最為關鍵,一條查詢語句,條件語句不當可能會導致
查詢出大量非必須的數(shù)據(jù),無法得到想要的結(jié)果;修改,刪除的條件語句錯誤,
更是可能導致數(shù)據(jù)的大量修改和破壞,甚至造成無法挽回的失誤。
在使用sql查詢分析器對數(shù)據(jù)庫表的數(shù)據(jù)進行增,刪,改操作時,作為數(shù)據(jù)維
護的工作人員通常都會在不需要執(zhí)行的sql語句前加入注釋,以防止執(zhí)行不必要
的sql操作,造成數(shù)據(jù)丟失或錯誤。但這種方法并不能完全避免人為失誤,特別是
對剛上崗的數(shù)據(jù)維護人員,其人為失誤可能性更大。而且如果一個表字段較多,
數(shù)據(jù)維護人員對表字段不熟悉時,手工輸入sql語句也會帶來不少的麻煩。
基于以上情況,開發(fā)一個通用的醫(yī)院信息系統(tǒng)數(shù)據(jù)庫維護工具,,使對數(shù)據(jù)庫
的這些基本操作集中在一個簡單、直觀的窗體界面上,利用該工具對表結(jié)構(gòu)進行
分析,組合成所需要的sql語句來對數(shù)據(jù)庫表進行操作,可減少不必要的麻煩,方
便維護人員對數(shù)據(jù)庫的維護.
3 系統(tǒng)設計思路
首先根據(jù)用戶指定的服務器讀取服務器的數(shù)據(jù)庫,進而讀取其中的表,當用
戶選定一個表時,對其表結(jié)構(gòu)進行分析,返回一個列表,列表應包含如字段名,類
型,主鍵,是否允許空等基本元素。然后通過對窗體生成前的一些設置,如每個
對應字段所應生成的控件類型等,系統(tǒng)根據(jù)表結(jié)構(gòu)和窗體設置生成一個臨時窗
體,待用戶調(diào)整好控件位置后,保存當前窗體的有關設置信息到自定義的文件格
式中,在注冊表寫入系統(tǒng)與自定義文件格式的關聯(lián),待下次用戶打開保存的文件
時就可以直接讀取配置信息構(gòu)建窗體,還原用戶當時保存的窗體界面。
4 開發(fā)環(huán)境與開發(fā)工具
開發(fā)環(huán)境: windows操作系統(tǒng)
開發(fā)工具:vasual studio 2005 C#語言環(huán)境,sql2000數(shù)據(jù)庫。
5 詳細設計
5.1 分析表結(jié)構(gòu) 首先用戶設置好待連接的服務器,登錄名和密碼,服務器登陸
成功后讀取其數(shù)據(jù)庫,返回一個列表,用戶選擇了數(shù)據(jù)庫后再讀取數(shù)據(jù)庫的表,
當用戶選定一個表時,對其表結(jié)構(gòu)進行分析,查詢表結(jié)構(gòu)的sql語句如下:
StringBuilder sb = new StringBuilder();
sb.Append("SELECT");
sb.Append(" 字段序號=a.colid,");
sb.Append(" 表ID=a.id,");
sb.Append(" 字段名=a.name,");
sb.Append(" 標識=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then
'√'else '' end,");
sb.Append(" 主鍵=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and
parent_obj=a.id and name in (");
sb.Append(" SELECT name FROM sysind |
|