Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere Web 服务

 

使用数据类型

缺省情况下,参数输入的 XML 编码为字符串,SOAP 服务格式的结果集输出中不包含明确描述结果集中列的数据类型的信息。对于所有格式,参数数据类型都为字符串。对于 DNET 格式,在响应的模式部分中所有列的数据类型均设置为字符串。CONCRETE 和 XML 格式不包含响应中的数据类型信息。可使用 DATATYPE 子句处理此缺省行为。

SQL Anywhere 允许使用 DATATYPE 子句设置数据类型。数据类型信息包含在参数输入和结果集输出或所有 SOAP 服务格式的响应的 XML 编码中。这样一来便不再需要客户端代码将参数显式转换为字符串,从而简化了从 SOAP 工具箱进行参数传递。例如,可将整数作为整型进行传递。XML 编码的数据类型允许 SOAP 工具箱分析数据并将其归到相应类型。

以独占方式使用字符串数据类型时,应用程序需要隐式地了解结果集内每列的数据类型。当 Web 服务器请求数据类型时,无需执行此操作。在定义 Web 服务时,可使用 DATATYPE 子句控制是否包括数据类型信息。

DATATYPE { OFF | ON | IN | OUT }
  • OFF   未使用 DATATYPE 选项时,此行为将是缺省行为。对于 DNET 输出格式,SQL Anywhere 数据类型将在 XML 模式字符串类型间相互转换。对于 CONCRETE 和 XML 格式,将不发出任何数据类型信息。

  • ON   为输入参数和结果集响应发出数据类型信息。将 SQL Anywhere 数据类型在 XML 模式数据类型间相互转换。

  • IN   仅发出输入参数的数据类型信息。

  • OUT   仅发出结果集响应的数据类型信息。

下面是征用结果集响应数据类型的 Web 服务定义的示例。

CREATE SERVICE "SASoapTest/EmployeeList"
TYPE 'SOAP'
AUTHORIZATION OFF
SECURE OFF
USER DBA
DATATYPE OUT
AS SELECT * FROM Employees;

在此示例中,由于此服务没有参数,因此仅为结果集响应请求数据类型信息。

数据类型适用于所有定义为 'SOAP' 类型的 SQL Anywhere Web 服务。

输入参数的数据类型

只要将参数数据类型公开为其在 WSDL 中由 DISH 服务生成的真实数据类型就可支持输入参数的数据类型。

典型字符串参数定义(或非类型参数)应如下所示:

<s:element minOccurs="0" maxOccurs="1" name="a_varchar" nillable="true" type="s:string" />

字符串参数可以为空,即它可以发生,也可以不发生。

对于确定类型的参数(例如整数),必须有该参数且不能为空。以下是一个示例。

<s:element minOccurs="1" maxOccurs="1" name="an_int" nillable="false" type="s:int" />
输出参数的数据类型

所有 'SOAP' 类型的 SQL Anywhere Web 服务都可公开响应数据内的数据类型信息。将数据类型公开为行集列元素内的属性。

以下是一个来自 SOAP FORMAT 'CONCRETE' Web 服务的 SimpleDataSet 类型响应的示例。

<SOAP-ENV:Body>
  <tns:test_types_concrete_onResponse>
   <tns:test_types_concrete_onResult xsi:type='tns:SimpleDataset'>
    <tns:rowset>
      <tns:row>
       <tns:lvc xsi:type="xsd:string">Hello World</tns:lvc>
       <tns:i xsi:type="xsd:int">99</tns:i>
       <tns:ii xsi:type="xsd:long">99999999</tns:ii>
       <tns:f xsi:type="xsd:float">3.25</tns:f>
       <tns:d xsi:type="xsd:double">.555555555555555582</tns:d>
       <tns:bin xsi:type="xsd:base64Binary">AAAAZg==</tns:bin>
       <tns:date xsi:type="xsd:date">2006-05-29-04:00</tns:date>
      </tns:row>
     </tns:rowset>
   </tns:test_types_concrete_onResult>
  <tns:sqlcode>0</tns:sqlcode>
  </tns:test_types_concrete_onResponse>
</SOAP-ENV:Body>

以下是一个返回字符串格式 XML 数据的 SOAP FORMAT 'XML' Web 服务的响应示例。内部行集由编码的 XML 组成,为便于理解在此处以其解码形式显示。

<SOAP-ENV:Body>
 <tns:test_types_XML_onResponse>
  <tns:test_types_XML_onResult xsi:type='xsd:string'>
   <tns:rowset 
     xmlns:tns="http://localhost/satest/dish" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <tns:row>
     <tns:lvc xsi:type="xsd:string">Hello World</tns:lvc>
     <tns:i xsi:type="xsd:int">99</tns:i>
     <tns:ii xsi:type="xsd:long">99999999</tns:ii>
     <tns:f xsi:type="xsd:float">3.25</tns:f>
     <tns:d xsi:type="xsd:double">.555555555555555582</tns:d>
     <tns:bin xsi:type="xsd:base64Binary">AAAAZg==</tns:bin>
     <tns:date xsi:type="xsd:date">2006-05-29-04:00</tns:date>
    </tns:row>
   </tns:rowset>
  </tns:test_types_XML_onResult>
  <tns:sqlcode>0</tns:sqlcode>
 </tns:test_types_XML_onResponse>
</SOAP-ENV:Body>

请注意,除了数据类型信息外,这些元素的命名空间和 XML 模式还提供 XML 分析程序进行后处理所必需的全部信息。如果结果集中不存在数据类型信息(DATATYPE OFF 或 IN),则忽略 xsi:type 和 XML 模式命名空间声明。

SOAP FORMAT 'DNET' Web 服务返回的 SimpleDataSet 类型的示例如下:

<SOAP-ENV:Body>
  <tns:test_types_dnet_outResponse>
   <tns:test_types_dnet_outResult xsi:type='sqlresultstream:SqlRowSet'>
    <xsd:schema id='Schema2' 
       xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
       xmlns:msdata='urn:schemas-microsoft.com:xml-msdata'>
     <xsd:element name='rowset' msdata:IsDataSet='true'>
      <xsd:complexType>
       <xsd:sequence>
        <xsd:element name='row' minOccurs='0' maxOccurs='unbounded'>
         <xsd:complexType>
          <xsd:sequence>
           <xsd:element name='lvc' minOccurs='0' type='xsd:string' />
           <xsd:element name='ub' minOccurs='0' type='xsd:unsignedByte' />
           <xsd:element name='s' minOccurs='0' type='xsd:short' />
           <xsd:element name='us' minOccurs='0' type='xsd:unsignedShort' />
           <xsd:element name='i' minOccurs='0' type='xsd:int' />
           <xsd:element name='ui' minOccurs='0' type='xsd:unsignedInt' />
           <xsd:element name='l' minOccurs='0' type='xsd:long' />
           <xsd:element name='ul' minOccurs='0' type='xsd:unsignedLong' />
           <xsd:element name='f' minOccurs='0' type='xsd:float' />
           <xsd:element name='d' minOccurs='0' type='xsd:double' />
           <xsd:element name='bin' minOccurs='0' type='xsd:base64Binary' />
           <xsd:element name='bool' minOccurs='0' type='xsd:boolean' />
           <xsd:element name='num' minOccurs='0' type='xsd:decimal' />
           <xsd:element name='dc' minOccurs='0' type='xsd:decimal' />
           <xsd:element name='date' minOccurs='0' type='xsd:date' />
          </xsd:sequence>
         </xsd:complexType>
        </xsd:element>
       </xsd:sequence>
      </xsd:complexType>
     </xsd:element>
    </xsd:schema>
    <diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'>
     <rowset>
      <row>
       <lvc>Hello World</lvc>
       <ub>128</ub>
       <s>-99</s>
       <us>33000</us>
       <i>-2147483640</i>
       <ui>4294967295</ui>
       <l>-9223372036854775807</l>
       <ul>18446744073709551615</ul>
       <f>3.25</f>
       <d>.555555555555555582</d>
       <bin>QUJD</bin>
       <bool>1</bool>
       <num>123456.123457</num>
       <dc>-1.756000</dc>
       <date>2006-05-29-04:00</date>
      </row>
     </rowset>
    </diffgr:diffgram>
   </tns:test_types_dnet_outResult>
  <tns:sqlcode>0</tns:sqlcode>
  </tns:test_types_dnet_outResponse>
</SOAP-ENV:Body>
将 SQL Anywhere 类型映射到 XML 模式类型
SQL Anywhere 类型 XML 模式类型 XML 示例
CHAR string Hello World
VARCHAR string Hello World
LONG VARCHAR string Hello World
TEXT string Hello World
NCHAR string Hello World
NVARCHAR string Hello World
LONG NVARCHAR string Hello World
NTEXT string Hello World
UNIQUEIDENTIFIER string 12345678-1234-5678-9012-123456789012
UNIQUEIDENTIFIERSTR string 12345678-1234-5678-9012-123456789012
XML

此项由用户定义。假定参数是表示复杂类型(例如 base64Binary、SOAP 数组、struct)的有效 XML。

<inputHexBinary xsi:type="xsd:hexBinary"> 414243 </inputHexBinary>

(解释为 'ABC')

BIGINT long -9223372036854775807
UNSIGNED BIGINT unsignedLong 18446744073709551615
BIT boolean 1
VARBIT string 11111111
LONG VARBIT string 00000000000000001000000000000000
DECIMAL decimal -1.756000
DOUBLE double .555555555555555582
FLOAT float 12.3456792831420898
INTEGER int -2147483640
UNSIGNED INTEGER unsignedInt 4294967295
NUMERIC decimal 123456.123457
REAL float 3.25
SMALLINT short -99
UNSIGNED SMALLINT unsignedShort 33000
TINYINT unsignedByte 128
MONEY decimal 12345678.9900
SMALLMONEY decimal 12.3400
DATE date 2006-11-21-05:00
DATETIME dateTime 2006-05-21T09:00:00.000-08:00
SMALLDATETIME dateTime 2007-01-15T09:00:00.000-08:00
TIME time 14:14:48.980-05:00
TIMESTAMP dateTime 2007-01-12T21:02:14.420-06:00
BINARY base64Binary AAAAZg==
IMAGE base64Binary AAAAZg==
LONG BINARY base64Binary AAAAZg==
VARBINARY base64Binary AAAAZg==

如果一个或多个参数属于 NCHAR、NVARCHAR、LONG NVARCHAR 或 NTEXT 类型,则响应输出采用 UTF8 格式。如果客户端数据库使用 UTF-8 字符编码,则不存在行为的变化(因为 NCHAR 和 CHAR 数据类型是相同的)。不过,如果数据库不使用 UTF-8 字符编码,则所有不属于 NCHAR 数据类型的参数都将转换为 UTF8。XML 声明编码和 Content-Type HTTP 标头的值将与使用的字符编码相对应。

将 XML 模式类型映射到 Java 类型
XML 模式类型 Java 数据类型
xsd:string java.lang.String
xsd:integer java.math.BigInteger
xsd:int int
xsd:long long
xsd:short short
xsd:decimal java.math.BigDecimal
xsd:float float
xsd:double double
xsd:boolean boolean
xsd:byte byte
xsd:QName javax.xml.namespace.QName
xsd:dateTime javax.xml.datatype.XMLGregorianCalendar
xsd:base64Binary byte[ ]
xsd:hexBinary byte[ ]
xsd:unsignedInt long
xsd:unsignedShort int
xsd:unsignedByte short
xsd:time javax.xml.datatype.XMLGregorianCalendar
xsd:date javax.xml.datatype.XMLGregorianCalendar
xsd:g javax.xml.datatype.XMLGregorianCalendar
xsd:anySimpleType java.lang.Object
xsd:anySimpleType java.lang.String
xsd:duration javax.xml.datatype.Duration
xsd:NOTATION javax.xml.namespace.QName