Caché での Web サービスおよび Web クライアントの作成
SOAP メッセージでのデータセットの使用
[Home] [Back] [Next]
InterSystems: The power behind what matters   
Class Reference   
Search:    

この章では、%XML.DataSet について説明します。このメソッドは、Web サービスと Web クライアントの両方が Caché を基盤とする場合や、いずれかが .NET を使用する場合に、SOAP メッセージで使用できる XML 対応のデータセットです。他の SOAP ベンダは、データセットをサポートしていません。

この章では、以下の項目に関する詳細を示します。
データセットについて
データセットとは、Microsoft 社によって定義され (また、NET で使用され)、Caché でもサポートされている XML 形式の結果セットです。Web サービスと Web クライアントの両方が Caché を基盤とする場合や、いずれかが .NET を使用する場合、データセットを Web メソッドへの入力または Web メソッドからの出力として使用できます。他の SOAP テクノロジでは、この形式は認識されません。
Caché で Web サービスまたはクライアントを使用して作業する場合には、データセットを表現するために %XML.DataSet (またはカスタム・サブクラス) を使用します。%XML.DataSet は、標準の %ResultSet クラスの、XML 対応のサブクラスであり、そのクラスを使用する場合と同じように使用します。"Caché SQL の使用法" の ダイナミック SQL の使用法 を参照してください。
注意:
%XML.DataSet クラスは単一のテーブルのみをサポートします。つまり、それが使用するクエリは単一のテーブルのみを返すことができます。
サンプル Web サービス SOAP.Demo (SAMPLES ネームスペース内にあります) では、Caché でのデータセットの例を示します。具体的には、以下の Web メソッドでデータセットを使用します。
Java ベースの Web クライアントで使用できるようにクエリの結果を出力するには、%ListOfObjects サブクラスを使用します。SOAP.Demo に例があります。
typed データセットの定義
データセットではすべて、取得するデータを指定するクエリが使用されます。コンパイル時にクエリが既知のとき、データセットは typed となり、それ以外の場合は untyped となります。typed データセットは多くの場面で便利に使うことができます。例えば、.NET では、typed データセットによって Microsoft Visual Studio のコードを実行できます。
typed データセットを定義するには、%XML.DataSet のサブクラスを作成し、QUERYNAME パラメータと CLASSNAME パラメータを指定します。これらのパラメータは共に、特定の 1 つの SQL クエリを参照します。データセットのスキーマを生成すると、%XML.DataSet ではカスタム・データ型の LogicalToXSD() メソッドなど、クラスとプロパティのメタデータが考慮されます。
注意:
%XML.DataSet をメソッドの返り値として使用する場合、その値の XML タイプは DataSet です。一方、%XML.DataSet のサブクラスを返り値として使用する場合、この値の XML タイプはそのサブクラスの名前です。この動作は、他の XML 対応のクラスのものと同じであり、WSDL に記述される XML タイプに影響を及ぼします。"オブジェクトの XML への投影" の XML タイプへの投影の制御 の章を参照してください。
データセットの形式の制御
既定では、データセットは、Microsoft DiffGram 形式で書き込まれ、XML スキーマが前に付きます。以下に例を示します。
<SOAP-ENV:Body>
  <Get0Response xmlns="http://www.myapp.org">
    <Get0Result>
    <s:schema id="DefaultDataSet" xmlns="" 
    attributeFormDefault="qualified" 
    elementFormDefault="qualified"
    xmlns:s="http://www.w3.org/2001/XMLSchema" 
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
      <s:element name="DefaultDataSet" msdata:IsDataSet="true">
        <s:complexType>
          <s:choice maxOccurs="unbounded">
            <s:element name="GetPeople">
              <s:complexType>
                <s:sequence>
                  <s:element name="Name" type="s:string" minOccurs="0" />
                  <s:element name="DOB" type="s:date" minOccurs="0" />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:choice>
        </s:complexType>
      </s:element>
    </s:schema>

    <diffgr:diffgram 
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
      <DefaultDataSet xmlns="">
        <GetPeople diffgr:id="GetPeople1" msdata:rowOrder="0">
          <Name>Quine,Howard Z.</Name>
          <DOB>1965-11-29</DOB>
        </GetPeople>
...
      </DefaultDataSet>
    </diffgr:diffgram>
   </Get0Result>
 </Get0Response>  
</SOAP-ENV:Body>
%XML.DataSet クラスには、この形式を制御する以下のオプションがあります。
%XML.DataSet は、CaseSensitive プロパティも提供します。これは、同じ名前の Microsoft データセット・プロパティに対応します。互換性の理由から、既定値は False です。
データセットとスキーマの XML としての表示
%XML.DataSet を拡張するデータセットには、XML の生成に使用できるユーティリティ・メソッドがあります。これらのメソッドはすべて現在のデバイスに書き込みます。
XML 対応のオブジェクトからの XML スキーマ生成の詳細は、"Caché XML ツールの使用法" を参照してください。
WSDL への影響
Caché Web サービスで %XML.DataSet を Web メソッドへの入力または出力として使用する場合、WSDL に影響を与え、Caché および .NET 以外のクライアントで WSDL の利用に問題が発生します。
typed データセットの場合、WSDL では (<types> セクション内に) 以下の要素が含まれます。
<s:element name="GetDataSetByNameResponse">
   <s:complexType>
      <s:sequence>
        <s:element name="GetDataSetByNameResult" type="s0:ByNameDataSet" /> 
      </s:sequence>
   </s:complexType>
</s:element>
<s:complexType name="ByNameDataSet">
   <s:sequence>
     <s:any namespace="http://tempuri.org/ByNameDataSet" /> 
   </s:sequence>
</s:complexType>
untyped データセットの場合、WSDL では以下の要素が含まれます。
<s:element name="GetByNameResponse">
   <s:complexType>
      <s:sequence>
         <s:element name="GetByNameResult" type="s0:DataSet" /> 
      </s:sequence>
   </s:complexType>
</s:element>
<s:complexType name="DataSet">
   <s:sequence>
      <s:element ref="s:schema" /> 
   <s:any /> 
   </s:sequence>
</s:complexType>
後者の場合、Caché または .NET 以外のツール内で Web クライアントを生成しようとする場合、そのツールに関する十分な情報がないためにエラーが発生します。Metro の場合は、WSDL を利用しようとする前に、追加のスキーマ情報をロードできます。そのためには、wsimport と呼ばれるコマンドライン・ツールを使用できます。この手法によって、クライアントを生成するのに十分な情報を提供することができます。
ただし、どの場合でも、クライアントが適切な形式でメッセージを解釈または生成できるようにコードを記述するには、相当の作業が必要です。