数据类型类(Data Type Classes
):用作对象类中文本属性的类型。本文中,简写为 DTC
。
DTC
提供以下功能:
SQL 逻辑操作
、客户端数据类型 和 转换信息 来提供 SQL、ODBC、ActiveX 和 Java 互操作性。DTC
类参数扩展或自定义这些值。有关编译器如何使用DTC
为属性生成代码的信息,请参阅“使用和重写属性方法”一章。
DTC
在许多方面与其他类不同:
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
和 %Boolean
的DTS
的方法生成器。这些方法生成器为每个属性创建方法,并将这些方法添加到容器类中。如上所述,这些方法称为属性方法。它们的名称以它们所适用的属性的名称开头。例如,对于 P1
属性,编译器会生成 P1IsValid()
、P1Normalize()
、P1LogicalToDisplay()
、P1ToDisplayToLogical()
等方法。%ValidateObject()
实例方法时,该方法会依次调用 P1IsValid()
、P2IsValid()
和 P3IsValid()
— 也就是说,它调用 IsValid()
方法。Caché SQL
访问关联表中的所有字段,并且 SQL 运行时模式是 ODBC
,则 Caché
会为每个属性调用 LogicalToODBC()
方法,以便查询以 ODBC
格式返回结果。请注意,属性方法在类定义中不可见。
许多属性方法将数据从一种格式转换为另一种格式,例如,在以人类可读的格式显示数据或通过 ODBC 访问数据时。格式为:
类参数在与DTC
一起使用时具有特殊行为。对于DTC
,类参数用于提供一种基于数据类型自定义任何属性行为的方法。
例如,%Integer DTC
具有一个类参数 MAXVAL
,该参数指定 %Integer
类型属性的最大有效值。如果定义具有属性 NumKids
的类,如下所示:
Property NumKids As %Integer(MAXVAL=10);
这将指定 NumKids
属性的 %Integer
类的 MAXVAL
参数将设置为 10。
在内部,其工作原理如下:
DTC
的验证方法都作为方法生成器实现,并使用其各种类参数来控制这些验证方法的生成。NumKidsIsValidDT()
方法生成内容,该方法测试 NumKids
的值是否超过 10
。如果不使用类参数,创建此功能将需要定义IntegerLessThanTen
类。若要轻松定义DTC
,请首先确定符合您需求的现有DTC
, 然后创建此类的子类。在您的子类中:
SqlCategory
、ClientDataType
和 OdbcType
指定合适的值。MAXLEN
参数,以便该属性没有长度限制。DTC
的方法。在实现中,根据需要引用此类的参数。如果数据类型类不基于现有数据类型类,请确保将 [ ClassType=datatype ]
添加到类定义中。如果将类基于另一个数据类型类,则不需要此声明。
根据您的需要,您应该在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
如果DTC
中包括 DISPLAYLIST
和 VALUELIST
参数,则这些方法必须首先检查这些类参数是否存在,并包含用于处理这些列表的代码(如果存在)。其他方法的逻辑与此类似。
在大多数情况下,其中许多方法都是方法生成器。示例如下:
ClassMethod LogicalToDate(%val As %MV.Date) As %Library.Date [ CodeMode = expression, ServerOnly = 1 ]
{
$s(%val="":"",1:%val+46385)
}
注意:数据格式和转换方法不能包含嵌入式 SQL
。如果需要在此逻辑中调用嵌入式 SQL
,则可以将嵌入式 SQL
放在单独的例程中,该方法可以调用此例程。
还可以将实例方法添加到DTC
中
%val
: 方法中可以使用变量 %val
,该变量包含属性的当前值。DTC
的任何类中生成关联的属性方法。例如,自定义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=+$h
w instance.DOBToMyDate(),!
// 输出
2023-12-29