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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere-Webdienste

 

Mit Datentypen arbeiten

Standardmäßig ist die XML-Kodierung von Parametereingaben eine Zeichenfolge und die Ergebnismengenausgabe für SOAP-Dienst-Formate enthält keine Informationen, die speziell den Datentyp der Ergebnismengenspalten beschreiben. Die Datentypen für Parameter aller Formate sind Zeichenfolgen. Im DNET-Format haben alle Spalten innerhalb des Schemaabschnitts der Antwort den Zeichenfolgen-Datentyp. Die Formate CONCRETE und XML enthalten keine Datentypinformation in der Antwort. Dieses Standardverhalten kann mit der DATATYPE-Klausel geändert werden.

SQL Anywhere ermöglicht die Angabe von Datentypen mit der DATATYPE-Klausel. Datentypinformationen können in der XML-Kodierung der Parametereingabe und der Ergebnismengenausgabe bzw. -antworten für alle SOAP-Dienstformate enthalten sein. Dies vereinfacht die Parameterübergabe von SOAP-Toolkits, da es nicht erforderlich ist, dass der Clientcode Parameter explizit in Zeichenfolgen umwandelt. Eine Ganzzahl kann beispielsweise als "int" übergeben werden. XML-kodierte Datentypen ermöglichen es einem SOAP-Toolkit, die Daten syntaktisch zu analysieren und sie in den entsprechenden Datentyp umzuwandeln.

Wenn ausschließlich Zeichenfolgen-Datentypen verwendet werden, muss die Anwendung den Datentyp jeder Spalte der Ergebnismenge implizit kennen. Dies ist nicht erforderlich, wenn die Angabe von Datentypen vom Webserver verlangt wird. Um zu steuern, ob Datentypinformationen einbezogen werden, kann bei der Definition des Webdiensts die DATATYPE-Klausel angegeben werden.

DATATYPE { OFF | ON | IN | OUT }
  • OFF   Dies ist das Standardverhalten, wenn die DATATYPE-Option nicht benutzt wird. Beim DNET-Ausgabeformat werden die SQL Anywhere-Datentypen in bzw. aus den Zeichenfolgentypen des XML-Schemas konvertiert. Für die Formate CONCRETE und XML werden keine Datentypinformationen ausgegeben.

  • ON   Datentypinformationen werden sowohl für Eingabeparameter als auch für Ergebnismengenantworten ausgegeben. SQL Anywhere-Datentypen werden in und aus den Datentypen des XML-Schemas konvertiert.

  • IN   Datentypinformationen werden nur für Eingabeparameter ausgegeben.

  • OUT   Datentypinformationen werden nur für Ergebnismengenantworten ausgegeben.

Das folgende Beispiel zeigt eine Webdienstdefinition, die die Datentypfestlegung für die Ergebnismengenantwort enthält.

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

In diesem Beispiel werden Datentypeninformationen nur für Ergebnismengenantworten angefordert, da dieser Dienst keine Parameter hat.

Die Datentypfestlegung ist für alle SQL Anywhere-Webdienste anwendbar, die mit dem Typ 'SOAP' definiert sind.

Datentypfestlegung für Eingabeparameter

Die Festlegung von Datentypen für Eingabeparameter wird dadurch unterstützt, dass die Datentypen der Parameter einfach in der vom DISH-Dienst generierten WSDL-Sprache als ihre tatsächlichen Datentypen dargestellt werden.

Eine typische Zeichenfolgen-Parameterdefinition (oder ein Parameter ohne Datentypangabe) sieht folgendermaßen aus:

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

Der Zeichenfolgenparameter kann erscheinen oder auch nicht.

Für einen Parameter, für den ein Datentyp festgelegt wurde, wie etwa eine Ganzzahl, muss der Parameter zwingend erscheinen. Im Folgenden finden Sie ein Beispiel.

<s:element minOccurs="1" maxOccurs="1" name="an_int" nillable="false" type="s:int" />
Datentypfestlegung für Ausgabeparameter

Alle SQL Anywhere-Webdienste vom Typ 'SOAP' können Datentypinformationen in die Antwortdaten einbeziehen. Die Datentypen werden im Spaltenelement der Zeilenmenge in Form von Attributen angegeben.

Das folgende Beispiel zeigt eine typisierte SimpleDataSet-Antwort eines SOAP FORMAT 'CONCRETE'-Webdienstes.

<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>

Das folgende Beispiel zeigt eine Antwort eines SOAP FORMAT 'XML'-Webdienstes, in der die XML-Daten als Zeichenfolge zurückgegeben werden. Die innere Zeilengruppe umfasst kodierten XML-Code und wird hier aus Gründen der Lesbarkeit in dekodierter Form dargestellt.

<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>

Beachten Sie, dass der Namespace für die Elemente und das XML-Schema zusätzlich zu den Datentypinformationen auch alle Informationen liefert, die für die Nachbearbeitung durch einen XML-Parser erforderlich sind. Wenn in der Ergebnismenge keine Datentypinformationen vorhanden sind (DATATYPE OFF oder IN), werden die xsi:type- und die XML-Schema-Namespace-Deklaration weggelassen.

Das folgende Beispiel zeigt einen Webdienst mit dem SOAP FORMAT 'DNET', der ein SimpleDataSet mit Angabe des Datentyps zurückgibt:

<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-Datentypen entsprechenden XML Schema-Datentypen zuordnen
SQL Anywhere-Datentyp XML Schema-Datentyp XML-Beispiel
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

Dies ist benutzerdefiniert. Von einem Parameter wird angenommen, dass er gültigen XML-Code für einen komplexen Typ darstellt (z.B. base64Binary, SOAP-Array, struct).

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

(interpretiert als '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==

Wenn ein oder mehrere Parameter vom Typ NCHAR, NVARCHAR, LONG NVARCHAR oder NTEXT sind, erfolgt die Antwortausgabe in UTF8. Wenn die Clientdatenbank den UTF-8-Zeichensatz verwendet, gibt es keine Änderung im Verhalten (da NCHAR- und CHAR-Datentypen dieselben sind). Wenn die Datenbank allerdings nicht den UTF-8-Zeichensatz verwendet, werden alle Parameter, die nicht vom NCHAR-Datentyp sind, zu UTF8 konvertiert. Der Wert des XML-Deklarationszeichensatzes und des Content-Type HTTP-Headers werden dem verwendeten Zeichensatz entsprechen.

Zuordnung von XML Schema-Datentypen und Java-Datentypen
XML Schema-Datentyp Java-Datentyp
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