辛華坤 焦 青 胡 磊 張光玉 郭永新
(1. 泰山醫(yī)學(xué)院放射學(xué)院,山東 泰安 271016; 2. 泰山醫(yī)學(xué)院附屬醫(yī)院眼科,山東 泰安 271000)
在信息管理系統(tǒng)中,查詢是獲取數(shù)據(jù)庫(kù)信息的主要方法。需要查詢的數(shù)據(jù)在數(shù)據(jù)庫(kù)中以表格的形式存放,在VC++ 中利用ADO對(duì)象連接數(shù)據(jù)庫(kù)后可實(shí)現(xiàn)對(duì)表格的訪問。ADO是為Microsoft最新和最強(qiáng)大的數(shù)據(jù)訪問接口OLE DB而設(shè)計(jì)的,是一個(gè)便于使用的應(yīng)用程序?qū)咏涌?。OLE DB為任何數(shù)據(jù)源提供了高性能的訪問,這些數(shù)據(jù)元包括關(guān)系和非關(guān)系數(shù)據(jù)庫(kù)、電子郵件、文件系統(tǒng)、文本和圖形和自定義業(yè)務(wù)對(duì)象等等[1]。在將數(shù)據(jù)提取出來后,通過條件篩選來確定數(shù)據(jù)查詢范圍,得到需要的查詢結(jié)果。
在我們的前期工作中,開發(fā)了一個(gè)眼科電子病歷系統(tǒng)。系統(tǒng)數(shù)據(jù)庫(kù)有七個(gè)表格,分別存放基本信息、臨床信息、眼科臨床體征、實(shí)驗(yàn)室檢查結(jié)果、臨床診斷、臨床治療及隨訪信息。系統(tǒng)可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的單表單條件、單表多條件以及多表多條件查詢功能。本研究的目的在于利用ADO對(duì)象連接眼科電子病歷系統(tǒng)中的數(shù)據(jù)庫(kù),利用SQL語句拼接方法實(shí)現(xiàn)單表單條件、單表多條件和多表多條件的多種查詢功能。
SQL語句拼接方法與傳統(tǒng)的SQL語句枚舉法不同,后者的思想比較簡(jiǎn)單,其出發(fā)點(diǎn)為針對(duì)不同的查詢條件組合形式列出與之對(duì)應(yīng)的SQL語句,最終執(zhí)行的SQL語句只是其中的一條。對(duì)于電子病歷條件查詢的實(shí)現(xiàn)需要將變量動(dòng)態(tài)地添加到SQL語句中。SQL語句的拼接彌補(bǔ)了枚舉法的缺點(diǎn),靈活運(yùn)用VC中變量存放的條件,減少了語句的條數(shù),提高了代碼的執(zhí)行效率。在實(shí)現(xiàn)拼接時(shí),首先對(duì)SQL查詢語句各命令分段,然后動(dòng)態(tài)地與條件變量連接起來,并經(jīng)表格和條件的需求判斷,拼接成一個(gè)整句,最后經(jīng)ADO對(duì)象連接數(shù)據(jù)庫(kù)。
SQL查詢語句中各命令使用方法為:
①select后接查詢目標(biāo),即查詢的表格名和字段名;
②from后接操作表對(duì)象,可以是一個(gè)表或多個(gè)表,或者是一個(gè)表的多個(gè)副本;
③where后接的是進(jìn)行操作的記錄的條件,可以是表達(dá)式,表達(dá)式中也可以嵌套select的子查詢[2]。
2.1單表單條件查詢的實(shí)現(xiàn)
單表單條件通常用作最基本的查詢,即SQL語句枚舉法,如僅對(duì)姓名或編號(hào)條件進(jìn)行限定,操作員可通過其快速獲得所需病人的所有信息。該查詢不需要SQL語句的拼接,直接利用對(duì)SQL語句的執(zhí)行實(shí)現(xiàn)。
例如查詢患者“孟祥華”的信息可以通過如下過程實(shí)現(xiàn):
①確定SQL語句,由于查詢條件為存放于表basicinfo中姓名為“孟祥華”患者的基本信息,則查詢SQL語句為selectt*frombasicinfowherename= ‘孟祥華’。
②在VC中設(shè)置編輯框?yàn)镃Sting型變量m_name,用于存放姓名變量。在“查詢”的消息響應(yīng)函數(shù)中連接數(shù)據(jù)庫(kù)。
③設(shè)置CString型變量csSQL=”select*frombasicinfowherename=’”+m_name+”’”。
④執(zhí)行csSQL即可獲取所需數(shù)據(jù),并將數(shù)據(jù)在程序界面上顯示。
2.2單表多條件查詢的實(shí)現(xiàn)
單表多條件用于對(duì)存放于同一表格中的多個(gè)條件限定。多條件必須按照一定規(guī)則組合才能使查詢得出正確結(jié)果,而組合方式可能有許多種,多條件組合查詢模塊中,模塊分為條件設(shè)定和結(jié)果顯示兩個(gè)部分,限于篇幅,本文只討論條件設(shè)定模塊。
條件設(shè)定模塊,即參數(shù)設(shè)定模塊,用于用戶選擇查詢項(xiàng)目和查詢條件,查詢條件的數(shù)目可以根據(jù)查詢的要求進(jìn)行增減,用戶也可根據(jù)需要選擇多個(gè)字段進(jìn)行組合,從而使查詢功能具有很強(qiáng)的動(dòng)態(tài)性和自定義性[3]。當(dāng)前的動(dòng)態(tài)多條件查詢方法可以分為查詢條件枚舉法、SQL語句比較拼接和改進(jìn)的SQL語句拼接3種[4],本文對(duì)于多條件的查詢運(yùn)用SQL語句拼接的方法,分為主句和條件句,拼接流程見圖1。
圖1 單表多條件查詢語句拼接流程圖
例如欲查詢年齡在60歲以上所有男性患者的信息,可通過如下過程實(shí)現(xiàn):
①確定SQL語句,查詢條件為存放于表basicinfo中年齡在60歲以上所有男性患者的基本信息。確定SQL語句為”select*frombasicinfowheresex= ‘男’andage> 60”。
②在VC中設(shè)置編輯框CString型變量m_sex,用于存放性別變量,設(shè)置long型變量m_age用于存放年齡變量。
③對(duì)SQL語句分段,將整句分為主段和條件段。主段為csSQL=”select*frombasicinfo”,條件段為所需要查詢的條件”wheresex= ‘男’andage> 60”,將主段和條件段拼接成所需要的SQL語句。查詢時(shí)需要先判定每個(gè)存放條件變量的編輯框是否為空值,再執(zhí)行條件的拼接。在多條件查詢中,第一個(gè)條件在SQL語句中以where開頭,后面的條件以and連接,因此還需要對(duì)所有條件是否為第一次拼接用一個(gè)布爾型變量進(jìn)行判斷。
④執(zhí)行SQL語句后用SetItemText函數(shù)遍歷到列表控件中顯示。
2.3多表多條件查詢的實(shí)現(xiàn)
多表多條件查詢所需信息存放在數(shù)據(jù)庫(kù)的多個(gè)表中,并可對(duì)多個(gè)條件的檢索范圍進(jìn)行限定。拼接較為復(fù)雜,但可以同時(shí)實(shí)現(xiàn)其他兩種查詢方式,通常用作對(duì)于對(duì)病人信息進(jìn)行檢索和統(tǒng)計(jì)語句。當(dāng)檢索條件涉及兩個(gè)不同的表時(shí)(這可以通過檢查結(jié)構(gòu)信息表實(shí)現(xiàn)),必須在WHERE子句中添加相應(yīng)的表格關(guān)聯(lián)條件[5],使同一姓名或編號(hào)的病人多張表格的信息對(duì)應(yīng),再對(duì)信息進(jìn)行檢索。因此多表多條件的查詢需要更多的分段。
首先輸入“select*from”語句,判斷各個(gè)條件在VC中對(duì)應(yīng)的變量是否為空,如果變量不為空即該SQL語句查詢需要該條件,通過對(duì)條件存在表格位置判定該SQL語句查詢的條件是否存放于多表,如果存放在單表,則輸入語句轉(zhuǎn)到單表單條件和單表多條件的查詢方式,并進(jìn)一步對(duì)條件數(shù)進(jìn)行判斷,如查詢條件只有一條則實(shí)現(xiàn)單表單條件查詢,如查詢條件有多條則進(jìn)行SQL語句的拼接;如果存放在多表,則進(jìn)行多表多條件查詢的實(shí)現(xiàn)。語句拼接流程圖如下。
圖2 多表多條件查詢語句拼接流程圖
例如可以通過如下過程實(shí)現(xiàn)查詢存放于基本信息表中,性別為男性且診斷信息表中診斷信息中含有糖尿病關(guān)鍵字患者的信息:
①確定SQL語句,查詢條件為存放于基本信息表中性別為男性和診斷信息表中診斷信息中含有糖尿病關(guān)鍵字患者。確定SQL語句為select*frombasicinfo,clinicaldiagnosiswherebasicinfo.name=clinicaldiagnosis.nameandsex= ‘男’and[clinicaldiagnosisinfo]like‘%糖尿病%’。
②在程序中先判定不為空編輯框的條件所存在的表格是否為一張表格,若為一張表格則實(shí)現(xiàn)方法與單表單條件查詢相同。
③若為不同表格則判斷信息存在的表格,將表名依次相加后再令這些表格相關(guān)聯(lián),最后將條件依次以and相連。
④設(shè)置兩個(gè)CString類型變量分別存放性別和診斷結(jié)果??蓪⒄浞譃?部分:
“select*from”:作為主句在最前,用以連接后面的語句。
“basicinfo,diagnosis”:表格名,此部分需先確定程序中不為空值的條件存放的表格,將這些表格依次寫入語句,第一張表格只寫表格名,后面表格前加逗號(hào)。
“wherebasicinfoname=clinicaldiagnosis.name”:表格關(guān)聯(lián)條件,用來將不同表格病人的信息對(duì)應(yīng)。與單表單條件查詢要求相似,需要確定順序,第一張表格前加”where”,后面表格前加”=”,可以用一個(gè)布爾型變量判斷。
“andsex= ‘男’and[clinicaldiagnosisinfo]like‘%糖尿病%’”:條件語句,無排序要求。
⑤語句拼接后用SetItemText函數(shù)遍歷到列表控件中顯示,顯示結(jié)果見圖3所示。圖3中框1所指部分按性別的下拉菜單選中男性,在框2所指部分的診斷結(jié)果中輸入關(guān)鍵字“糖尿病”,點(diǎn)擊查詢將所限制條件范圍病人的所有信息顯示在框3所指的列表控件中。
圖3 多表多條件查詢系統(tǒng)界面
本研究探討了包括單表單條件、單表多條件和多表多條件在內(nèi)的三種查詢的實(shí)現(xiàn)方法,這些方法適用于大多數(shù)系統(tǒng)數(shù)據(jù)庫(kù)。在該眼科電子病歷系統(tǒng)的實(shí)現(xiàn)中,SQL語句的拼接使得VC++連接數(shù)據(jù)庫(kù)后實(shí)現(xiàn)通過將變量動(dòng)態(tài)地添加到SQL語句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,從而極大地提高了數(shù)據(jù)庫(kù)的操作效率,實(shí)現(xiàn)了存放于數(shù)據(jù)庫(kù)中不同字段和不同表格的信息的靈活運(yùn)用,使操作員可以更加方便地查詢到所需信息,從而進(jìn)行病人數(shù)據(jù)的檢索和統(tǒng)計(jì),對(duì)于疾病研究具有十分重要的意義。
[1] 劉刀桂,孟繁晶. Visual C++實(shí)踐與提高數(shù)據(jù)庫(kù)篇[M]. 北京:中國(guó)鐵道出版社,2001.
[2] 穆彤娜,于洪敏,張鐵成. 數(shù)據(jù)庫(kù)系統(tǒng)綜合查詢方法研究[J]. 中國(guó)礦業(yè)大學(xué)學(xué)報(bào),2006,35(2):260-264.
[3] 趙大偉,陳剛. 基于.NET的多條件組合查詢技術(shù)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù),2012,25(8):6045-6048.
[4] 周千明,王巧俠,朱欣娟. 通用動(dòng)態(tài)多條件查詢方法的研究與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù),2011,4(7):738-740.
[5] 姜文軍,佟學(xué)輝. 病案管理系統(tǒng)中任意條件查詢的實(shí)現(xiàn)[J]. 計(jì)算機(jī)時(shí)代,2003,09:34-35.
山東第一醫(yī)科大學(xué)(山東省醫(yī)學(xué)科學(xué)院)學(xué)報(bào)2013年10期