文章
· 七月 28, 2021 阅读大约需 2 分钟

类关键字SoapBodyUse,SqlCategory,SqlRowIdName,SqlRowIdPrivate

第三十三章 类关键字 - SoapBodyUse

指定此类中定义的任何web method的编码。此关键字仅适用于web服务web客户端类。

用法

要指定此类的web method的输入和输出所使用的编码,请使用以下语法:

Class MyApp.MyClass [ SoapBodyUse = soapbodyuse ]  { //class members }

其中soapbodyuse是下列之一:

  • literal 文字(默认)—默认情况下,此类中的web method使用文字数据。也就是说,SOAP消息的<Body>中的XMLWSDL中给出的模式完全匹配。
  • encoded 编码—默认情况下,此类中的web method使用SOAP编码的数据。也就是说,SOAP消息的<Body>中的XML使用了适合所使用的SOAP版本的SOAP编码,如以下规范所要求的:

重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。当使用SOAP向导从WSDL生成web客户端或服务时,InterSystems IRIS会将此关键字设置为适合该WSDL;如果修改该值,web客户端或服务可能不再工作。

详解

此关键字指定此类中定义的任何web method使用的默认编码。它还控制这个类的ELEMENTQUALIFIEDXMLELEMENT参数的默认值,这将在本主题的一个小节中讨论。

可以通过使用SoapBodyUse方法关键字或SoapBodyUse查询关键字,为单个方法重写此关键字。

对子类的影响

此关键字不是继承的。

默认

默认值为文字。(SOAP标准V1.1指定web method应该使用SOAP编码。但是,大多数SOAP客户端(包括.NET)都使用文字样式。)

WSDL的关系

SoapBodyUse关键字指定了WSDL<binding>部分中<soap:body>元素的Use属性的值。例如,如果SoapBodyUse是字面意思,则WSDL可能如下所示:

...
<binding name="MyServiceNameSoap" 
 ...
    <soap:binding ...
    <operation name="Add">
        <soap:operation ...>
        <input>
            <soap:body use="literal"/>
        </input>
        <output>
            <soap:body use="literal"/>
        </output>
    </operation>
</binding>
...

相反,如果对SoapBodyUse进行编码,则WSDL可以改为如下所示:

...
<binding name="MyServiceNameSoap" ...
    <soap:binding ...
    <operation name="Add">
        <soap:operation .../>
        <input>
            <soap:body use="encoded" namespace="http://www.mynamespace.org" 
                       encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </input>
        <output>
            <soap:body use="encoded" namespace="http://www.mynamespace.org" 
                       encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </output>

    </operation>
</binding>
...

对于SOAP 1.2,编码样式属性改为如下:

encodingStyle="http://www.w3.org/2003/05/soap-encoding"

SoapBodyUse关键字还确定每个web method<message>元素的<part>元素的内容:

  • 如果SoapBodyUse是字面量,则每个<part>元素都包含一个元素属性。例如:
<part name="parameters" element="s0:Add"/>

再举一个例子:

<part name="b" element="s0:b"/>
  • 如果对SoapBodyUse进行了编码,则每个<part>元素都包含一个类型属性,而不是元素属性。例如:
<part name="a" type="s0:ComplexNumber"/>

请注意,SoapBodyUse还控制ELEMENTQUALIFIEDXMLELEMENT参数的默认值,这也会影响WSDL

对SOAP消息的影响

对于使用文档样式消息的web方法,web服务会发送如下响应消息:

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' 
                   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
                   xmlns:s='http://www.w3.org/2001/XMLSchema'>
   <SOAP-ENV:Body>
      <AddResponse ...>
...

相反,对于使用编码样式消息的web服务,响应消息如下:

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' 
                   xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
                   xmlns:s='http://www.w3.org/2001/XMLSchema' 
                   xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' 
                   xmlns:tns='http://www.mynamespace.org' 
                   xmlns:types='http://www.mynamespace.org'>
   <SOAP-ENV:Body SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'>
      <types:AddResponse>
...

对网络服务或网络客户端参数默认值的影响

ELEMENTQUALIFIED参数的默认值取决于SoapBodyUse关键字:

SoapBodyUse的值 ELEMENTQUALIFIEDd的默认值 Notes
literal 1 | elementFormDefault="qualified"
encoded 0 elementFormDefault="unqualified"

XMLELEMENT参数的默认值也依赖于SoapBodyUse关键字:

SoapBodyUse的值 XMLELEMENT的默认值 Notes
literal 1 消息部分具有元素属性
encoded 0 消息部分具有类型属性

与%XML.DataSet一起使用

对于 %XML.DataSet, 类型的对象,并非 SoapBindingStyleSoapBodyUse 关键字的所有排列都是允许的。

第三十四章 类关键字 - SqlCategory

指定在SQL中用于计算的类型。仅适用于数据类型类。

用法

要指定用于SQL计算的类型,请使用以下语法:

Class MyApp.MyString [ ClassType = DataType, SQLCategory = STRING ]  { //class members }

其中sqlcategory是下列之一:

  • DATE
  • DOUBLE
  • FMDATE
  • FMTIMESTAMP
  • INTEGER
  • MVDATE
  • NAME
  • NUMERIC
  • STRING (默认)
  • TIME
  • TIMESTAMP

详解

此关键字指定在SQL计算中用于此类的类型。

每个数据类型类都必须指定一个SQL类别

创建新的数据类型类时,请使用与正在创建的数据类型最匹配的SQL类别值,或者,更好的做法是,将现有数据类型类子类化并继承其SQL类别

对子类的影响

这个关键字是从主超类继承的。子类可以覆盖关键字的值。

默认

默认的SQL类别是字符串。

第三十五章 类关键字 - SqlRowIdName

覆盖这个类的ID列的默认SQL字段名
仅适用于持久类。

用法

要覆盖这个类的ID列的默认SQL字段名,使用以下语法:

Class MyApp.MyClass [ SqlRowIdName = MyId ]  { //class members }

其中MyId是一个SQL标识符

详解

此关键字覆盖用于ID列的默认SQL字段名

当一个持久化类被投影为一个SQL表时,每个对象的Object Identity值被投影为一个SQL列——Row ID列。
默认情况下,Row ID列称为ID
如果类有另一个名为ID的字段,则使用ID1(以此类推)。
SqlRowIdName关键字允许直接设置Row ID列的名称。

对子类影响

该关键字继承自主超类。
子类可以覆盖关键字的值。

默认

如果忽略此关键字,则该类的ID列的SQL字段名称为ID

第三十六章 类关键字 - SqlRowIdPrivate

指定这个类的ID列在投射到ODBCJDBC时是否为隐藏字段。
仅适用于持久类。

用法

当将表投射到ODBCJDBC时,要隐藏ID列,请使用以下语法:

Class MyApp.MyClass [ SqlRowIdPrivate ]  { //class members }

否则,忽略此关键字或将单词Not在关键字之前。

详解

如果该关键字为true,那么当表被投射到ODBCJDBC时,ID列就是一个隐藏字段。

当一个持久化类被投影为一个SQL表时,每个对象的Object Identity值被投影为一个SQL列——Row ID列。
SqlRowIdPrivate关键字允许指定是否应该对ODBC和基于jdbc的查询“隐藏”这个Row ID列。
如果行ID列被隐藏:

  • 它不会被各种目录查询报告为列
  • 它不包含在SELECT *查询中。

如果查询显式地在select子句中列出了该列,那么ODBCJDBC客户机可以选择该列。
(注意,根据定义,不能在UPDATEINSERT语句中使用Row ID列,因为不能修改或直接设置Row ID的值)。

通常,在处理遗留关系数据并且不希望报告工具看到Row ID列的情况下,使用此关键字。

对子类的影响

此关键字不是继承的。

默认

如果省略此关键字,当表被投影到ODBCJDBC时,ID列通常是可见的。

讨论 (0)1
登录或注册以继续