一、Caché简介及多维存储
Caché数据库是Inter Systems公司的产品,为了适应互联网的迅速发展对数据存储效率的要求,Inter Systems公司经过多年的努力,研发出了Caché数据库。Caché是新一代高性能数据库技术,它被誉为创新的“后关系型”数据库,作为后关系型数据库,它可以采用三种方式对其中的数据进行访问:1.对象数据库访问;2.SQL语句进行访问;3.采用多维数组的方式。
示例1.1:对象方式
/// function:通过对象的方式获取CT_Title的数据
/// debug:w ##class(web.TestTitle).GetDataByObj(11)
ClassMethod GetDataByObj(Id As %String) As %String
{
set TTLRowId=""
set TTLCode=""
set TTLDesc=""
set PObj=##class(User.CTTitle).%OpenId(Id)
if (PObj){
set TTLRowId=Id
set TTLCode=PObj.TTLCode
set TTLDesc=PObj.TTLDesc
}
Quit TTLRowId_" "_TTLCode_" "_TTLDesc
}
示例1.2:SQL方式
/// function:通过SQL的方式获取CT_Title的数据
/// debug:w ##class(web.TestTitle).GetDataBySQL(11)
ClassMethod GetDataBySQL(Id As %String) As %String
{
set TTLRowId=""
set TTLCode=""
set TTLDesc=""
&SQL(
select TTL_RowId,TTL_Code,TTL_Desc
into :TTLRowId,:TTLCode,:TTLDesc
from SQLUser.CT_Title where TTL_RowId=:Id
)
Quit TTLRowId_" "_TTLCode_" "_TTLDesc
}
示例1.3:多维数组方式
/// function:通过多维数组的方式获取CT_Title的数据
/// debug:w ##class(web.TestTitle).GetDataByGlobal(11)
ClassMethod GetDataByGlobal(Id As %String) As %String
{
set TTLRowId=""
set TTLCode=""
set TTLDesc=""
set TTLRowId=Id
set TTLCode=$p($g(^CT("TTL",TTLRowId)),"^",1)
set TTLDesc=$p($g(^CT("TTL",TTLRowId)),"^",2)
Quit TTLRowId_" "_TTLCode_" "_TTLDesc
}
二、Caché数据库的特点
1.Caché包括应用服务器
Caché提供的不仅仅是一种单纯的数据库技术,在Caché中包括一个应用服务器,这个服务器提供高级对象编程,并且可以很容易地与很多技术集成。
2.Caché的编程技术--M语言
Caché提供了可以用多种技术编写数据库和业务逻辑的能力。Caché的ObjectScript支持所有数据存取方法:对象、SQL、多维数组和嵌入式 HTML 。Caché Basic 与 Visual Basic 非常相似,只是做了很少的调整扩展,以便利用 Caché独特的性能。
3.Caché的CSP技术
Caché为开发复杂的、基于网页应用程序提供了丰富的集成开发环境。Caché Service Page(CSP)技术可以进行快速开发,动态产生。
示例2.1:默认的CSP页面
<html>
<head>
<!-- Put your page Title here -->
<title> Cache Server Page </title>
</head>
<body>
<!-- Put your page code here -->
My page body
</body>
</html>
示例2.2:通过CSP实现前后端交互
<csp:method name=OnPreHTTP arguments="" returntype=%Boolean>
i ##Class(websys.SessionEvents).SessionExpired() q 1
quit 1
</csp:method>
<html>
<head>
<title>Test</title>
</head>
<body>
<div style="margin:0 auto;width:400px;height:400px;background-color:#C5B6B6;">
<form action="dhcastudentcourse.csp" method="get">
课程代码: <input class="h50" type="text" value="#($g(%request.Data("CourseNum",1)))#" id="CourseNum" name="CourseNum">
<input class="h50" type="submit" value="查询" id="Find">
</form>
<table style="width:100%;">
<server>
Set LocId = %session.Data("LOGON.CTLOCID")
Set LocDesc = $p(^CTLOC(LocId),"^",2)
set CourseNum = $g(%request.Data("CourseNum",1))
if (CourseNum'=""){
Set rs = ##class(%ResultSet).%New("web.DHCAStudentCourse:FindInfo")
Set %sc = rs.Execute(CourseNum)
w "<tr><td>姓名</td><td>分数</td></tr>"
While(rs.Next()){
w "<tr><td>"_rs.GetDataByName("StName")_"</td><td>"_rs.GetDataByName("Score")_"</td></tr>"
}
Do rs.Close()
Set rs = ""
}
</server>
</table>
<div>
当前用户: #(%session.Data("LOGON.USERNAME"))#
当前科室: #(LocDesc)#
</div>
</div>
</body>
</html>
三、开发环境及映射关系
1.开发环境
开发环境B/S架构
Web容器 : IIS
开发语言: M
数据库: Caché
IE-->IIS ->CSP Gateway ->csp application->dhc.logon.csp--反向操作
2.命名空间与数据库的映射关系
应用程序通过命名空间访问数据库里的数据和程序,因此, 命名空间和数据库之间要建立映射。命名空间和数据库之间的映射不一定是一对一的。一个数据库可以被多个命名空间访问;相反,一个命名空间可以访问多个数据库里的数据。建立命名空间的主要工作就是建立与数据库的映射,这样做可以将程序逻辑与物理存在的数据独立开来,便于开发人员专注于系统功能设计,不需要为未来实施时不同的系统架构而作出额外的工序,系统架构也因为这样变得更灵活。