李成亮+姚偉
摘 要: Caché數(shù)據(jù)庫(kù)提供了便捷、穩(wěn)定、高效的C/S架構(gòu)訪問(wèn)服務(wù)。介紹了三種VB語(yǔ)言訪問(wèn)Caché數(shù)據(jù)庫(kù)的方式,即通過(guò)ODBC方式、COM方式、Web Service方式,并采用統(tǒng)一的DataGrid控件對(duì)返回的數(shù)據(jù)集進(jìn)行了顯示。結(jié)合Caché以多維數(shù)組存儲(chǔ)數(shù)據(jù)的優(yōu)勢(shì),對(duì)三種方式的訪問(wèn)效率進(jìn)行了測(cè)試,并且根據(jù)每種方式的特點(diǎn),分析了三種方式的優(yōu)缺點(diǎn),為Caché數(shù)據(jù)庫(kù)C/S架構(gòu)的開(kāi)發(fā)提供了參考。
關(guān)鍵詞: Caché; C/S架構(gòu); VB; 方法研究
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2017)08-20-04
Abstract: Database Caché provides a convenient, stable and efficient C/S architecture access service. This paper introduces three methods to access the Caché database with VB language, i.e. the COM method, ODBC method and Web Service method, and a uniform DataGrid widget is adopted to display the returned data set. With the advantage that Caché stores data in multidimensional arrays, the access efficiency is tested in three ways, and the advantages and disadvantages of three methods are analyzed according to the characteristics of each method respectively to provide a reference for the development of Caché database in C/S architecture.
Key words: Caché; C/S architecture; VB; method research
0 引言
為了適應(yīng)Internet 迅猛發(fā)展對(duì)數(shù)據(jù)庫(kù)信息技術(shù)的需求,InterSystems公司研發(fā)的“后關(guān)系型”數(shù)據(jù)庫(kù)(Post-Relational Database)Caché融合了對(duì)象數(shù)據(jù)庫(kù)訪問(wèn)、高性能的SQL訪問(wèn)、強(qiáng)大的多維數(shù)據(jù)訪問(wèn)這三種方法,其推出的用戶接口支持大多數(shù)通用的開(kāi)發(fā)工具(如VB、Delphi、Java或者C++),可以讓程序員根據(jù)自己熟悉的程序設(shè)計(jì)語(yǔ)言快速地進(jìn)行開(kāi)發(fā)[1-2]。
VB語(yǔ)言具有強(qiáng)大的Windows界面表現(xiàn)功能,采用事件驅(qū)動(dòng)機(jī)制,程序員可以輕松地使用VB語(yǔ)言對(duì)數(shù)據(jù)庫(kù)進(jìn)行C/S架構(gòu)的開(kāi)發(fā)。本文基于VB語(yǔ)言,詳細(xì)介紹了三種方式訪問(wèn)Caché數(shù)據(jù)庫(kù),即傳統(tǒng)的關(guān)系型ODBC(Open Database Connectivity,開(kāi)放數(shù)據(jù)庫(kù)連接)方式、COM(Component Object Model,組件對(duì)象模型)方式、Web Service方式。結(jié)合Caché以多維數(shù)組存儲(chǔ)數(shù)據(jù)的優(yōu)勢(shì),對(duì)這三種方式的訪問(wèn)效率進(jìn)行測(cè)試,根據(jù)每種方式的特點(diǎn),分析三種方式的優(yōu)缺點(diǎn),以期為Caché數(shù)據(jù)庫(kù)C/S架構(gòu)的開(kāi)發(fā)提供參考。
1 訪問(wèn)Caché數(shù)據(jù)庫(kù)的方式
1.1 ODBC方式
ODBC是目前訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)最主要的方法。它提供了一系列通用的數(shù)據(jù)庫(kù)管理的標(biāo)準(zhǔn)接口,使得編程人員的開(kāi)發(fā)不必了解底層的DBMS,即通過(guò)訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)API(Application Programming Interface,應(yīng)用程序編程接口),可以對(duì)不同的DBMS的數(shù)據(jù)庫(kù)進(jìn)行操作[5]。
VB訪問(wèn)Caché數(shù)據(jù)庫(kù)時(shí),須首先通過(guò)ODBC管理器注冊(cè)一個(gè)數(shù)據(jù)源,該數(shù)據(jù)源包括數(shù)據(jù)源名稱、數(shù)據(jù)庫(kù)路徑、數(shù)據(jù)庫(kù)類型、ODBC驅(qū)動(dòng)程序等信息。
1.2 COM方式
COM是微軟公司開(kāi)發(fā)的標(biāo)準(zhǔn),依照COM標(biāo)準(zhǔn)開(kāi)發(fā)出來(lái)的組件(以二進(jìn)制形式存在)可以直接嵌入到其他支持COM的程序中。COM組件中含有類型庫(kù)(Type Library),在類型庫(kù)中定義了組件的功能、類型信息及調(diào)用方法。當(dāng)準(zhǔn)備訪問(wèn)COM組件時(shí),將首先獲得類型庫(kù)的信息,然后根據(jù)類型庫(kù)的描述去去訪問(wèn)COM組件[3]。
Caché數(shù)據(jù)庫(kù)提供的COM組件,名為CacheObject。VB在客戶端引用,通過(guò)該組件可以直接進(jìn)行SQL查詢,或者調(diào)用Caché類中的查詢方法,返回結(jié)果集對(duì)象供客戶端使用,從而實(shí)現(xiàn)客戶端與服務(wù)器端之間的數(shù)據(jù)交互。
1.3 Web Service方式
Web Service是一種基于XML、HTTP的分布式組件技術(shù),是一個(gè)通過(guò)Web進(jìn)行調(diào)用的API,不依賴于平臺(tái)、語(yǔ)言,實(shí)現(xiàn)了真正意義上的獨(dú)立性。
Caché數(shù)據(jù)庫(kù)在對(duì)Web Service的開(kāi)發(fā)和使用上提供了良好的支持和高效的開(kāi)發(fā)。VB引用SOAP庫(kù)文件通過(guò)URL直接調(diào)用接口的函數(shù)。
2 VB連接Caché數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
本文VB開(kāi)發(fā)的環(huán)境為Windows 7,IP地址為200.200.200.18,Caché數(shù)據(jù)庫(kù)部署在10.10.50.66服務(wù)器上,端口號(hào)為1972,數(shù)據(jù)庫(kù)的命名空間為DHC-APP。
2.1 ODBC方式的實(shí)現(xiàn)
在本機(jī)操作系統(tǒng)ODBC數(shù)據(jù)源管理器中選擇“InterSystems ODBC35”驅(qū)動(dòng)程序,系統(tǒng)數(shù)據(jù)源的配置界面如圖1所示。
點(diǎn)擊“Test Connection”,顯示“Connectivity test completed successfully!”則配置成功。
在VB工程中先引用ADO對(duì)象,定義其子對(duì)象Connection對(duì)象、Recordset對(duì)象分別為cn,rs。
連接Caché數(shù)據(jù)庫(kù)代碼為:
cn.ConnectionString="Data Source=DHC-APP"
2.2 COM方式的實(shí)現(xiàn)
CacheObject的類型庫(kù)中包含的接口如表1所示[3]。
在VB工程中引用CacheObject.dll,定義工廠對(duì)象及連接數(shù)據(jù)庫(kù)的代碼為:
Dim factory As New CacheObject.factory
ConStr="cn_iptcp:10.10.50.66[1972]:DHC-APP"
If factory.Connect(ConStr)=True Then
MsgBox "成功", vbOKOnly, "成功"
End If
2.3 Web Service方式的實(shí)現(xiàn)
VB訪問(wèn)Web Service的方法有幾種,本文選用在VB中引用Microsoft Soap Type Library 3.0,訪問(wèn)數(shù)據(jù)庫(kù)Web Service的代碼為:
Dim soapClient As New SoapClient30
soapClient.MSSoapInit "http://10.10.50.66/dthealth/web/
PHYZPaiCheGL.MyService.cls?wsdl"
3 VB數(shù)據(jù)查詢、顯示及效率測(cè)試分析
本文查詢Caché數(shù)據(jù)庫(kù)中表名為PA_ADM,記錄有20萬(wàn),查詢的日期為2015-10-14,需要查詢的字段為PAADM_ADMNo,PAADM_AdmDate,PAADM_AdmTime,PAADM_Type,PAADM_CreateUser,對(duì)返回的數(shù)據(jù)集采用DataGrid控件進(jìn)行顯示。Caché數(shù)據(jù)庫(kù)以多維數(shù)組存儲(chǔ),在服務(wù)器端開(kāi)發(fā)中,采用遍歷節(jié)點(diǎn)的方法以提高效率[4]。
3.1 ODBC方式查詢及數(shù)據(jù)顯示
VB直接采用標(biāo)準(zhǔn)SQL語(yǔ)言進(jìn)行數(shù)據(jù)查詢,代碼為:
cn.Open
rs.Open "SELECT PAADM_ADMNo, PAADM_AdmDate,
PAADM_AdmTime, PAADM_Type, PAADM_CreateUser
FROM PA_Adm WHERE PAADM_AdmDate
='2015-10-14' ", cn, adOpenKeyset, adLockOptimistic
由于返回的為標(biāo)準(zhǔn)記錄集,所以可以直接作為DataGrid的數(shù)據(jù)源。代碼為:
Set DataGrid1.DataSource=rs
3.2 COM方式查詢及數(shù)據(jù)顯示
VB通過(guò)COM方式查詢數(shù)據(jù)有兩種方法,即DynamicSQL()、ResultSet()。DynamicSQL()將SQL語(yǔ)句作為入?yún)ⅲ笈_(tái)對(duì)其解析,本質(zhì)還是使用SQL語(yǔ)言訪問(wèn);ResultSet()直接調(diào)用Caché的類方法進(jìn)行查詢。本文采用ResultSet()方法,代碼為:
Dim obj As Object
Dim ok As Boolean
Set obj=factory.ResultSet("PHYZPaiCheGL.Web
.FuzzyQuery2", "QueryPAAdm")
ok=obj.Execute("14/10/2015", "14/10/2015")
類方法QueryPAAdm中采用$o查詢的部分代碼為:
s pRowID=""
f aDate=StartDate:1:EndDate d
.f s pRowID=$o(^PAADMi("AdmDateCurr",aDate,
pRowID)) q:pRowID="" d
..s ADMNo=$p(^PAADM(pRowID),"^",81)
..s ADMDate=$p(^PAADM(pRowID),"^",6)
..s ADMDate=$zdt(ADMDate,4)
..s ADMTime=$p(^PAADM(pRowID),"^",7)
..s ADMTime=$zt(ADMTime,1)
..s ADMType=$p(^PAADM(pRowID),"^",2)
..s ADMUser=$p(^PAADM(pRowID),"^",43)
由于返回的記錄集需進(jìn)行處理,VB處理的形式不惟一,本文采用數(shù)組的形式存儲(chǔ),循環(huán)賦值給記錄集,從而作為DataGrid的數(shù)據(jù)源。部分代碼為:
以數(shù)組形式存儲(chǔ)
Dim aa()
Dim j As Integer
j=0
While obj.Next()
aa(0, j)=obj.GetData(1)
aa(1, j)=obj.GetData(2)
aa(2, j)=obj.GetData(3)
aa(3, j)=obj.GetData(4)
aa(4, j)=obj.GetData(5)
j=j+1
Wend
循環(huán)賦值給記錄集
Set adoRecordset=New ADODB.Recordset
For n=0 To j
With adoRecordset
For i=0 To .Fields.Count-1
.Fields(i).Value=aa(i, n)
Next i
.MoveNext
End With
Next n
數(shù)據(jù)顯示
Set DataGrid1.DataSource=adoRecordset
3.3 Web Service方式查詢
直接采用soapClient對(duì)象調(diào)用Web Service中的GetPAADM()方法,返回結(jié)果保存在變量中。
Dim text
text=soapClient.GetPAADM("14/10/2015", "14/10/2015")
Web Service中GetPAADM方法采用$o查詢的部分代碼為:
S retStr=""
S retStr=##class(%GlobalCharacterStream).%New()
d retStr.Rewind()
d retStr.Write("
S ret=0
s pRowID=""
f aDate=StartDate:1:EndDate d
.f s pRowID=$o(^PAADMi("AdmDateCurr",aDate,
pRowID)) q:pRowID="" d
..s myobj=##class(Sample.ToResultPAADM).%New()
..s myobj.aDMNo=$p(^PAADM(pRowID),"^",81)
..s myobj.aDMDate=$p(^PAADM(pRowID),"^",6)
..s myobj.aDMDate=$zdt(myobj.aDMDate,4)
..s myobj.aDMTime=$p(^PAADM(pRowID),"^",7)
..s myobj.aDMTime=$zt(myobj.aDMTime,1)
..s myobj.aDMType=$p(^PAADM(pRowID),"^",2)
..s myobj.aDMUser=$p(^PAADM(pRowID),"^",43)
..S Xml=##class(%GlobalCharacterStream).%New()
..S ret=myobj.XMLExportToStream(.Xml,"HIS")
..q:ret=0
..d retStr.CopyFrom(Xml)
d retStr.Write("
")
q retStr
Web Service返回的記錄集為XML格式,VB處理XML的方式也不惟一,本文采用一種較為方便的方法:將XML數(shù)據(jù)寫(xiě)入文件,將文件導(dǎo)入Access數(shù)據(jù)庫(kù)表中,查詢表中的數(shù)據(jù)作為DataGrid的數(shù)據(jù)源。
寫(xiě)入文件
Open "C:\sample.xml" For Output As #1
Print #1, text
Close #1
將XML文件讀入Access數(shù)據(jù)庫(kù)中
Const acAppendData=2
Set objAccess=CreateObject("Access.Application")
objAccess.OpenCurrentDatabase "C:\Scripts\Test.mdb"
objAccess.ImportXML "C:\sample.xml", acAppendData
顯示數(shù)據(jù)
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
cn.Open "Driver={Microsoft Access Driver (*.mdb)};
DBQ=C:\Scripts\Test.mdb"
rs.CursorLocation=adUseClient
rs.Open "select * from HIS", cn, adOpenKeyset,
adLockOptimistic
Set DataGrid1.DataSource=rs
3.4 查詢效率測(cè)試分析
本文查詢效率測(cè)試包括兩方面:一是測(cè)試查詢的效率;二是顯示數(shù)據(jù)的效率。
測(cè)試查詢的思路:采用VB中Timer函數(shù),在提交參數(shù)前、返回?cái)?shù)據(jù)后分別設(shè)置時(shí)間點(diǎn),每次查詢操作執(zhí)行100次取平均值,通過(guò)計(jì)算用時(shí)來(lái)比較每種查詢方法的效率。
測(cè)試顯示的思路:在返回?cái)?shù)據(jù)后、DataGrid顯示數(shù)據(jù)后分別設(shè)置時(shí)間點(diǎn),通過(guò)計(jì)算用時(shí)來(lái)比較每種顯示方法的效率。
本文在同一臺(tái)客戶端進(jìn)行測(cè)試,忽略網(wǎng)絡(luò)因素的影響,其結(jié)果如表2所示(單位:秒)。
根據(jù)各種方式的形式特征,歸納出三種方式訪問(wèn)數(shù)據(jù)庫(kù)的優(yōu)缺點(diǎn),如表3所示。
4 結(jié)論
基于C/S架構(gòu),Caché數(shù)據(jù)庫(kù)提供了三種方式訪問(wèn)。本文采用功能強(qiáng)大的VB語(yǔ)言,通過(guò)ODBC方式、COM方式、Web Service方式對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),并采用DataGrid控件對(duì)返回的數(shù)據(jù)集進(jìn)行顯示。結(jié)合Caché以多維數(shù)組存儲(chǔ)數(shù)據(jù)的優(yōu)勢(shì),對(duì)三種方式的訪問(wèn)效率進(jìn)行了測(cè)試,可以得出以下結(jié)論:
⑴ ODBC方式代碼簡(jiǎn)單,通俗易懂。但在多表查詢或數(shù)據(jù)訪問(wèn)量很大的情況下,查詢時(shí)間明顯增加;
⑵ COM方式包含了SQL訪問(wèn)和工廠對(duì)象訪問(wèn),SQL訪問(wèn)在某種程度可以代替ODBC方式,但返回的數(shù)據(jù)集仍需進(jìn)行處理方可使用DataGrid控件顯示。
在實(shí)際運(yùn)用過(guò)程中,為提高查詢的效率,通常采用COM方式中的工廠對(duì)象方法,對(duì)返回的記錄集可以根據(jù)具體情況靈活使用,但如何快速、簡(jiǎn)便地操作記錄集有待進(jìn)一步研究。
參考文獻(xiàn)(References):
[1] 雷舜東,吳幫華,黃海瑩,李玉明,張紅.Caché數(shù)據(jù)庫(kù)在醫(yī)院信息系統(tǒng)中的優(yōu)勢(shì)[J].實(shí)用醫(yī)院臨床雜志,2012.1:162-165
[2] 宗寧.Caché數(shù)據(jù)庫(kù)中Web Service的開(kāi)發(fā)與應(yīng)用[J].電腦編程技巧與維護(hù),2010.22:43-44
[3] Jason, Jeffery, Robert, Ryan. Caché' Developer's Guide to Object Oriented Software Development[M](未出版),2004.
[4] 李成亮,姚偉.Caché數(shù)據(jù)庫(kù)簡(jiǎn)單模糊查詢的研究與分析[J].計(jì)算機(jī)時(shí)代,2017.1:51-54
[5] 明日科技.Visual Basic從入門(mén)到精通[M].清華大學(xué)出版社,2008.