Caché Objects | 第六章 | 定义数据类型类(DTC)

2024-01-02 15:28

本文主要是介绍Caché Objects | 第六章 | 定义数据类型类(DTC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、DTC概述
    • 1.1 DTC功能
    • 1.2 DTC与其他类的区别
    • 1.3 属性(Property)方法及工作原理
    • 1.4 数据格式
    • 1.5 DTC中的参数
  • 二、定义DTC
    • 2.1 基于现有DTC
    • 2.2 完全自定义DTC
  • 三、在DTC中定义类方法
  • 四、在DTC中定义实例方法
    • 4.1 案例

数据类型类(Data Type Classes):用作对象类中文本属性的类型。本文中,简写为 DTC

一、DTC概述

1.1 DTC功能

DTC提供以下功能:

  • 它们通过提供 SQL 逻辑操作、客户端数据类型 和 转换信息 来提供 SQL、ODBC、ActiveX 和 Java 互操作性。
  • 它们为文本数据值提供验证,您可以使用DTC类参数扩展自定义这些值。
  • 它们管理文本数据的存储(在磁盘上)、逻辑(在内存中)和显示格式的转换。

有关编译器如何使用DTC属性生成代码的信息,请参阅“使用和重写属性方法”一章。

1.2 DTC与其他类的区别

DTC在许多方面与其他类不同:

  • 它们不能单独实例化或存储
  • 它们不能包含属性
  • 它们支持一组特定的方法(称为数据类型接口)。

1.3 属性(Property)方法及工作原理

Class Datatypes.Container Extends %RegisteredObject
{Property P1 As %String;Property P2 As %Integer;Property P3 As %Boolean;}

这里,我们称Datatypes.Container容器类

当您向类添加文本属性编译该类时,Caché 会向该类添加属性方法。属性方法控制容器类如何处理这些属性的数据。该系统的工作原理如下:

  • 每个DTS都提供了一组方法,更具体地说是方法生成器Caché 在编译使用它们的类时会使用这些方法。方法生成器是生成自己的运行时代码的方法。
    在这里显示的示例中,当我们编译数据Datatypes.Container类时,编译器使用 %String%Integer%BooleanDTS的方法生成器。这些方法生成器为每个属性创建方法,并将这些方法添加到容器类中。如上所述,这些方法称为属性方法。它们的名称以它们所适用的属性的名称开头。例如,对于 P1 属性,编译器会生成 P1IsValid()P1Normalize()P1LogicalToDisplay()P1ToDisplayToLogical() 等方法。
  • 容器类在处理过程中的自动调用属性方法。例如,当您为上面所示的类的实例调用 %ValidateObject() 实例方法时,该方法会依次调用 P1IsValid()P2IsValid()P3IsValid() — 也就是说,它调用 IsValid()方法。
  • 再举一个例子,如果容器类是持久类,并且您使用 Caché SQL 访问关联表中的所有字段,并且 SQL 运行时模式是 ODBC,则 Caché 会为每个属性调用 LogicalToODBC() 方法,以便查询以 ODBC 格式返回结果。

请注意,属性方法类定义中不可见。

1.4 数据格式

许多属性方法将数据从一种格式转换为另一种格式,例如,在以人类可读的格式显示数据或通过 ODBC 访问数据时。格式为:

  • 显示 — 可以输入和显示数据的格式。例如,“1998 年 4 月 3 日”或“1977 年 11 月 23 日”形式的日期。
  • 逻辑 — 数据的内存格式,即执行操作所依据的格式。虽然日期具有上述显示格式,但其逻辑格式为整数;对于上述示例日期,其逻辑格式的值分别为 57436 和 50000。
  • 存储 — 数据的磁盘格式 — 将数据存储到数据库的格式。通常,这与逻辑格式相同。
  • ODBC — 可通过ODBC或JDBC呈现数据的格式。当数据向 ODBC/SQL 公开时,使用此格式。可用的格式与 ODBC 定义的格式相对应。
  • XSD — SOAP 编码格式。导出到 XML 或从 XML 导入时,将使用此格式。这仅适用于启用 XML 的类。

1.5 DTC中的参数

类参数在与DTC一起使用时具有特殊行为。对于DTC,类参数用于提供一种基于数据类型自定义任何属性行为的方法。
例如,%Integer DTC 具有一个类参数 MAXVAL,该参数指定 %Integer 类型属性的最大有效值。如果定义具有属性 NumKids 的类,如下所示:

Property NumKids As %Integer(MAXVAL=10);

这将指定 NumKids 属性的 %Integer 类的 MAXVAL 参数将设置为 10。

在内部,其工作原理如下:

  • 标准DTC的验证方法都作为方法生成器实现,并使用其各种类参数来控制这些验证方法的生成。
  • 在此示例中,此属性定义为 NumKidsIsValidDT() 方法生成内容,该方法测试 NumKids 的值是否超过 10。如果不使用类参数,创建此功能将需要定义IntegerLessThanTen类。

二、定义DTC

2.1 基于现有DTC

若要轻松定义DTC,请首先确定符合您需求的现有DTC, 然后创建此类的子类。在您的子类中:

  • 为关键字 SqlCategoryClientDataTypeOdbcType 指定合适的值。
  • 根据需要覆盖任何类参数。例如,可以重写 MAXLEN 参数,以便该属性没有长度限制。
    如果需要,还可以添加自己的类参数。
  • 根据需要重写DTC方法。在实现中,根据需要引用此类的参数。

2.2 完全自定义DTC

如果数据类型类不基于现有数据类型类,请确保将 [ ClassType=datatype ] 添加到类定义中。如果将类基于另一个数据类型类,则不需要此声明。

三、在DTC中定义类方法

根据您的需要,您应该在DTC中定义以下部分或全部类方法:

  • IsValid() — 执行属性数据的验证,如果适用,请使用属性参数。如前所述,任何对象类的 %ValidateObject() 实例方法都会为每个属性调用 IsValid() 方法。此方法具有以下签名, 其中 %val 是要验证的值。如果值无效,此方法应返回错误状态,否则应返回 $$$OK
ClassMethod IsValid(%val) As %Status 
  • Normalize() — 将属性的数据转换为标准形式或格式。任何对象类的 %NormalizeObject() 实例方法都会为每个属性调用 Normalize() 方法。此方法具有以下签名, 其中 %val 是要验证的值,Type 是合适的类型类。
ClassMethod Normalize(%val) As Type 
  • DisplayToLogical() — 将显示值转换为逻辑值。
ClassMethod DisplayToLogical(%val) As Type 
  • LogicalToDisplay() — 将逻辑值转换为显示值。
  • LogicalToOdbc() — 将逻辑值转换为 ODBC 值。
    请注意,ODBC 值必须与数据类型类的 OdbcType class 关键字指定的 ODBC 类型一致。
    LogicalToStorage() — 将逻辑值转换为存储值。
  • LogicalToXSD() — 将逻辑值转换为适当的 SOAP 编码值。
  • OdbcToLogical() — 将 ODBC 值转换为逻辑值。
  • StorageToLogical() — 将数据库存储值转换为逻辑值。
  • XSDToLogical() — 将 SOAP 编码的值转换为逻辑值。

如果DTC中包括 DISPLAYLISTVALUELIST 参数,则这些方法必须首先检查这些类参数是否存在,并包含用于处理这些列表的代码(如果存在)。其他方法的逻辑与此类似。

在大多数情况下,其中许多方法都是方法生成器。示例如下:

ClassMethod LogicalToDate(%val As %MV.Date) As %Library.Date [ CodeMode = expression, ServerOnly = 1 ]
{
$s(%val="":"",1:%val+46385)
}

注意:数据格式和转换方法不能包含嵌入式 SQL。如果需要在此逻辑中调用嵌入式 SQL,则可以将嵌入式 SQL 放在单独的例程中,该方法可以调用此例程。

四、在DTC中定义实例方法

还可以将实例方法添加到DTC

  • %val : 方法中可以使用变量 %val,该变量包含属性的当前值
  • 编译器使用这些方法在使用DTC的任何类中生成关联的属性方法

4.1 案例

例如,自定义DTC:Demo.Object.MyDate

Class Demo.Object.MyDate Extends %Date
{Method ToMyDate() As %String [ CodeMode = expression ]
{$ZDate(%val,3)
}}

定义一个Person类,添加属性DOB ,并设置其数据类型为刚自定义的MyDate

Class Demo.Object.Person Extends %RegisteredObject
{Property DOB As MyDate;}

底下,进行测试

 s instance=##class(QP.Object.Car).%New()s instance.DOB=+$hw instance.DOBToMyDate(),!// 输出
2023-12-29

这篇关于Caché Objects | 第六章 | 定义数据类型类(DTC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/562873

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

按揭贷款类型

按揭贷款可以根据不同的分类标准分为多种类型。以下是按揭贷款的一些常见分类: 按贷款利率分类: 固定利率按揭(Fixed Rate Mortgage, FRM):在整个贷款期间,利率保持不变,这意味着每月还款额也是固定的。浮动利率按揭(Adjustable Rate Mortgage, ARM):贷款利率随市场利率的变化而调整,通常有一个基准利率加上一定的浮动点数。 按还款方式分类: 等额本息(

PHP7扩展开发之类型处理

前言 这次,我们将演示如何在PHP扩展中如何对类型进行一些操作。如,判断变量类型。要实现的PHP代码如下: <?phpfunction get_size ($value) {if (is_string($value)) {return "string size is ". strlen($value);} else if (is_array($value)) {return "array si