李成亮+姚伟
摘 要: Caché数据库提供了便捷、稳定、高效的C/S架构访问服务。介绍了三种VB语言访问Caché数据库的方式,即通过ODBC方式、COM方式、Web Service方式,并采用统一的DataGrid控件对返回的数据集进行了显示。结合Caché以多维数组存储数据的优势,对三种方式的访问效率进行了测试,并且根据每种方式的特点,分析了三种方式的优缺点,为Caché数据库C/S架构的开发提供了参考。
关键词: Caché; C/S架构; VB; 方法研究
中图分类号:TP311 文献标志码:A 文章编号: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 引言
为了适应Internet 迅猛发展对数据库信息技术的需求,InterSystems公司研发的“后关系型”数据库(Post-Relational Database)Caché融合了对象数据库访问、高性能的SQL访问、强大的多维数据访问这三种方法,其推出的用户接口支持大多数通用的开发工具(如VB、Delphi、Java或者C++),可以让程序员根据自己熟悉的程序设计语言快速地进行开发[1-2]。
VB语言具有强大的Windows界面表现功能,采用事件驱动机制,程序员可以轻松地使用VB语言对数据库进行C/S架构的开发。本文基于VB语言,详细介绍了三种方式访问Caché数据库,即传统的关系型ODBC(Open Database Connectivity,开放数据库连接)方式、COM(Component Object Model,组件对象模型)方式、Web Service方式。结合Caché以多维数组存储数据的优势,对这三种方式的访问效率进行测试,根据每种方式的特点,分析三种方式的优缺点,以期为Caché数据库C/S架构的开发提供参考。
1 访问Caché数据库的方式
1.1 ODBC方式
ODBC是目前访问远程数据库最主要的方法。它提供了一系列通用的数据库管理的标准接口,使得编程人员的开发不必了解底层的DBMS,即通过访问数据库的标准API(Application Programming Interface,应用程序编程接口),可以对不同的DBMS的数据库进行操作[5]。
VB访问Caché数据库时,须首先通过ODBC管理器注册一个数据源,该数据源包括数据源名称、数据库路径、数据库类型、ODBC驱动程序等信息。
1.2 COM方式
COM是微软公司开发的标准,依照COM标准开发出来的组件(以二进制形式存在)可以直接嵌入到其他支持COM的程序中。COM组件中含有类型库(Type Library),在类型库中定义了组件的功能、类型信息及调用方法。当准备访问COM组件时,将首先获得类型库的信息,然后根据类型库的描述去去访问COM组件[3]。
Caché数据库提供的COM组件,名为CacheObject。VB在客户端引用,通过该组件可以直接进行SQL查询,或者调用Caché类中的查询方法,返回结果集对象供客户端使用,从而实现客户端与服务器端之间的数据交互。
1.3 Web Service方式
Web Service是一种基于XML、HTTP的分布式组件技术,是一个通过Web进行调用的API,不依賴于平台、语言,实现了真正意义上的独立性。
Caché数据库在对Web Service的开发和使用上提供了良好的支持和高效的开发。VB引用SOAP库文件通过URL直接调用接口的函数。
2 VB连接Caché数据库的实现
本文VB开发的环境为Windows 7,IP地址为200.200.200.18,Caché数据库部署在10.10.50.66服务器上,端口号为1972,数据库的命名空间为DHC-APP。
2.1 ODBC方式的实现
在本机操作系统ODBC数据源管理器中选择“InterSystems ODBC35”驱动程序,系统数据源的配置界面如图1所示。
点击“Test Connection”,显示“Connectivity test completed successfully!”则配置成功。
在VB工程中先引用ADO对象,定义其子对象Connection对象、Recordset对象分别为cn,rs。
连接Caché数据库代码为:
cn.ConnectionString="Data Source=DHC-APP"
2.2 COM方式的实现
CacheObject的类型库中包含的接口如表1所示[3]。
在VB工程中引用CacheObject.dll,定义工厂对象及连接数据库的代码为:
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方式的实现
VB访问Web Service的方法有几种,本文选用在VB中引用Microsoft Soap Type Library 3.0,访问数据库Web Service的代码为:
Dim soapClient As New SoapClient30
soapClient.MSSoapInit "http://10.10.50.66/dthealth/web/
PHYZPaiCheGL.MyService.cls?wsdl"
3 VB数据查询、显示及效率测试分析
本文查询Caché数据库中表名为PA_ADM,记录有20万,查询的日期为2015-10-14,需要查询的字段为PAADM_ADMNo,PAADM_AdmDate,PAADM_AdmTime,PAADM_Type,PAADM_CreateUser,对返回的数据集采用DataGrid控件进行显示。Caché数据库以多维数组存储,在服务器端开发中,采用遍历节点的方法以提高效率[4]。
3.1 ODBC方式查询及数据显示
VB直接采用标准SQL语言进行数据查询,代码为:
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
由于返回的為标准记录集,所以可以直接作为DataGrid的数据源。代码为:
Set DataGrid1.DataSource=rs
3.2 COM方式查询及数据显示
VB通过COM方式查询数据有两种方法,即DynamicSQL()、ResultSet()。DynamicSQL()将SQL语句作为入参,后台对其解析,本质还是使用SQL语言访问;ResultSet()直接调用Caché的类方法进行查询。本文采用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)
由于返回的记录集需进行处理,VB处理的形式不惟一,本文采用数组的形式存储,循环赋值给记录集,从而作为DataGrid的数据源。部分代码为:
以数组形式存储
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
循环赋值给记录集
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
数据显示
Set DataGrid1.DataSource=adoRecordset
3.3 Web Service方式查询
直接采用soapClient对象调用Web Service中的GetPAADM()方法,返回结果保存在变量中。
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数据写入文件,将文件导入Access数据库表中,查询表中的数据作为DataGrid的数据源。
写入文件
Open "C:\sample.xml" For Output As #1
Print #1, text
Close #1
将XML文件读入Access数据库中
Const acAppendData=2
Set objAccess=CreateObject("Access.Application")
objAccess.OpenCurrentDatabase "C:\Scripts\Test.mdb"
objAccess.ImportXML "C:\sample.xml", acAppendData
显示数据
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 查詢效率测试分析
本文查询效率测试包括两方面:一是测试查询的效率;二是显示数据的效率。
测试查询的思路:采用VB中Timer函数,在提交参数前、返回数据后分别设置时间点,每次查询操作执行100次取平均值,通过计算用时来比较每种查询方法的效率。
测试显示的思路:在返回数据后、DataGrid显示数据后分别设置时间点,通过计算用时来比较每种显示方法的效率。
本文在同一台客户端进行测试,忽略网络因素的影响,其结果如表2所示(单位:秒)。
根据各种方式的形式特征,归纳出三种方式访问数据库的优缺点,如表3所示。
4 结论
基于C/S架构,Caché数据库提供了三种方式访问。本文采用功能强大的VB语言,通过ODBC方式、COM方式、Web Service方式对数据库进行访问,并采用DataGrid控件对返回的数据集进行显示。结合Caché以多维数组存储数据的优势,对三种方式的访问效率进行了测试,可以得出以下结论:
⑴ ODBC方式代码简单,通俗易懂。但在多表查询或数据访问量很大的情况下,查询时间明显增加;
⑵ COM方式包含了SQL访问和工厂对象访问,SQL访问在某种程度可以代替ODBC方式,但返回的数据集仍需进行处理方可使用DataGrid控件显示。
在实际运用过程中,为提高查询的效率,通常采用COM方式中的工厂对象方法,对返回的记录集可以根据具体情况灵活使用,但如何快速、简便地操作记录集有待进一步研究。
参考文献(References):
[1] 雷舜东,吴帮华,黄海莹,李玉明,张红.Caché数据库在医院信息系统中的优势[J].实用医院临床杂志,2012.1:162-165
[2] 宗宁.Caché数据库中Web Service的开发与应用[J].电脑编程技巧与维护,2010.22:43-44
[3] Jason, Jeffery, Robert, Ryan. Caché' Developer's Guide to Object Oriented Software Development[M](未出版),2004.
[4] 李成亮,姚伟.Caché数据库简单模糊查询的研究与分析[J].计算机时代,2017.1:51-54
[5] 明日科技.Visual Basic从入门到精通[M].清华大学出版社,2008.