类关键字SoapBodyUse,SqlCategory,SqlRowIdName,SqlRowIdPrivate
第三十三章 类关键字 - SoapBodyUse
指定此类中定义的任何web method的编码。此关键字仅适用于web服务和web客户端类。
用法
要指定此类的web method的输入和输出所使用的编码,请使用以下语法:
Class MyApp.MyClass [ SoapBodyUse = soapbodyuse ] { //class members }
其中soapbodyuse是下列之一:
literal文字(默认)—默认情况下,此类中的web method使用文字数据。也就是说,SOAP消息的<Body>中的XML与WSDL中给出的模式完全匹配。encoded编码—默认情况下,此类中的web method使用SOAP编码的数据。也就是说,SOAP消息的<Body>中的XML使用了适合所使用的SOAP版本的SOAP编码,如以下规范所要求的:SOAP 1.1(https://www.w3.org/TR/2000/NOTE-SOAP-20000508/Opens in a new window)SOAP 1.2(https://www.w3.org/TR/soap12-part2/Opens in a new window)
重要提示:对于手动创建的web服务,该关键字的默认值通常是合适的。当使用SOAP向导从WSDL生成web客户端或服务时,InterSystems IRIS会将此关键字设置为适合该WSDL;如果修改该值,web客户端或服务可能不再工作。
详解
此关键字指定此类中定义的任何web method使用的默认编码。它还控制这个类的ELEMENTQUALIFIED和XMLELEMENT参数的默认值,这将在本主题的一个小节中讨论。
可以通过使用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还控制ELEMENTQUALIFIED和XMLELEMENT参数的默认值,这也会影响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 | |
| encoded | 0 | elementFormDefault="unqualified" |
XMLELEMENT参数的默认值也依赖于SoapBodyUse关键字:
| SoapBodyUse的值 | XMLELEMENT的默认值 | Notes |
|---|---|---|
| literal | 1 | 消息部分具有元素属性 |
| encoded | 0 | 消息部分具有类型属性 |
与%XML.DataSet一起使用
对于 %XML.DataSet, 类型的对象,并非 SoapBindingStyle 和 SoapBodyUse 关键字的所有排列都是允许的。
第三十四章 类关键字 - SqlCategory
指定在SQL中用于计算的类型。仅适用于数据类型类。
用法
要指定用于SQL计算的类型,请使用以下语法:
Class MyApp.MyString [ ClassType = DataType, SQLCategory = STRING ] { //class members }
其中sqlcategory是下列之一:
DATEDOUBLEFMDATEFMTIMESTAMPINTEGERMVDATENAMENUMERICSTRING(默认)TIMETIMESTAMP
详解
此关键字指定在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列在投射到ODBC和JDBC时是否为隐藏字段。
仅适用于持久类。
用法
当将表投射到ODBC和JDBC时,要隐藏ID列,请使用以下语法:
Class MyApp.MyClass [ SqlRowIdPrivate ] { //class members }
否则,忽略此关键字或将单词Not在关键字之前。
详解
如果该关键字为true,那么当表被投射到ODBC和JDBC时,ID列就是一个隐藏字段。
当一个持久化类被投影为一个SQL表时,每个对象的Object Identity值被投影为一个SQL列——Row ID列。
SqlRowIdPrivate关键字允许指定是否应该对ODBC和基于jdbc的查询“隐藏”这个Row ID列。
如果行ID列被隐藏:
- 它不会被各种目录查询报告为列
- 它不包含在
SELECT *查询中。
如果查询显式地在select子句中列出了该列,那么ODBC或JDBC客户机可以选择该列。
(注意,根据定义,不能在UPDATE或INSERT语句中使用Row ID列,因为不能修改或直接设置Row ID的值)。
通常,在处理遗留关系数据并且不希望报告工具看到Row ID列的情况下,使用此关键字。
对子类的影响
此关键字不是继承的。
默认
如果省略此关键字,当表被投影到ODBC和JDBC时,ID列通常是可见的。