Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

SOAP メッセージでのデータセットの使用

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

この章では、以下の項目に関する詳細を示します。

データセットについて

データセットとは、Microsoft 社によって定義され (また、NET で使用され)、Caché でもサポートされている XML 形式の結果セットです。Web サービスと Web クライアントの両方が Caché を基盤とする場合や、いずれかが .NET を使用する場合、データセットを Web メソッドへの入力または Web メソッドからの出力として使用できます。他の SOAP テクノロジでは、この形式は認識されません。

Caché で Web サービスまたはクライアントを使用して作業する場合には、データセットを表現するために %XML.DataSetOpens in a new tab (またはカスタム・サブクラス) を使用します。%XML.DataSetOpens in a new tab は、標準の %ResultSetOpens in a new tab クラスの、XML 対応のサブクラスであり、そのクラスを使用する場合と同じように使用します。"Caché SQL の使用法" の “ダイナミック SQL の使用法” を参照してください。

Note:

%XML.DataSetOpens in a new tab クラスは単一のテーブルのみをサポートします。つまり、それが使用するクエリは単一のテーブルのみを返すことができます。

サンプル Web サービス SOAP.DemoOpens in a new tab (SAMPLES ネームスペース内にあります) では、Caché でのデータセットの例を示します。具体的には、以下の Web メソッドでデータセットを使用します。

  • GetByName()

  • GetDataSetByName()

  • QueryByName()

Java ベースの Web クライアントで使用できるようにクエリの結果を出力するには、%ListOfObjectsOpens in a new tab サブクラスを使用します。SOAP.DemoOpens in a new tab に例があります。

typed データセットの定義

データセットではすべて、取得するデータを指定するクエリが使用されます。コンパイル時にクエリが既知のとき、データセットは typed となり、それ以外の場合は untyped となります。typed データセットは多くの場面で便利に使うことができます。例えば、.NET では、typed データセットによって Microsoft Visual Studio のコードを実行できます。

typed データセットを定義するには、%XML.DataSetOpens in a new tab のサブクラスを作成し、QUERYNAME パラメータと CLASSNAME パラメータを指定します。これらのパラメータは共に、特定の 1 つの SQL クエリを参照します。データセットのスキーマを生成すると、%XML.DataSetOpens in a new tab ではカスタム・データ型の LogicalToXSD() メソッドなど、クラスとプロパティのメタデータが考慮されます。

Note:

%XML.DataSetOpens in a new tab をメソッドの返り値として使用する場合、その値の XML タイプは DataSet です。一方、%XML.DataSetOpens in a new tab のサブクラスを返り値として使用する場合、この値の 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.DataSetOpens in a new tab クラスには、この形式を制御する以下のオプションがあります。

  • DATAONLY パラメータと DiffGram プロパティは、出力が DiffGram 形式であるかどうかを制御します。前述のとおり、既定では、出力は DiffGram 形式です。%XML.DataSetOpens in a new tab をサブクラスに指定し、DATAONLY を 1 に設定した場合、または DiffGram を 0 に設定した場合は、出力が DiffGram 形式ではなくなります。この場合の XML データセットの本文は次のようになります。

    <SOAP-ENV:Body>
      <Get0Response xmlns="http://www.myapp.org">
        <Get0Result>
          <GetPeople xmlns="">
            <Name>Quine,Howard Z.</Name>
            <DOB>1965-11-29</DOB>
          </GetPeople>
          <GetPeople xmlns="">
    ...
        </Get0Result>
      </Get0Response>  
    </SOAP-ENV:Body>
    

    DiffGram 形式の場合とは対照的に、既定ではスキーマは出力されず、出力に <diffgram> 要素が含まれません。

  • NeedSchema プロパティは、出力に XML スキーマを含めるかどうかを制御します。DiffGram 形式を使用していると、既定でスキーマが出力されますが、DiffGram 形式を使用していないと、既定ではスキーマが出力されません。スキーマの出力を強制するには、NeedSchema を 1 に設定します。またはスキーマの出力を抑止するには、このプロパティを 0 に設定します。

  • DiffGram 形式を使用すると、WriteEmptyDiffgram プロパティによって、データセットに行が含まれない場合の <diffgram> 要素の内容が制御されます。以下に示すように、既定では (または WriteEmptyDiffgram が 0 の場合は)、<diffgram> 要素には空の要素が含められます。

    ...
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
    xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
       <DefaultDataSet xmlns="">
       </DefaultDataSet>
    </diffgr:diffgram>
    ...
    

    対照的に、WriteEmptyDiffgram が 1 のときは、<diffgram> 要素には何も含まれません。

    ...
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 
    </diffgr:diffgram>
    ...
    

    DiffGram 形式を使用していない場合、このプロパティによる影響はありません。

  • DiffGram 形式を使用すると、DataSetName プロパティによって、<diffgram> 要素に含まれる要素の名前が制御されます。前述の例のとおり、既定では、この要素は <DefaultDataSet> と名付けられます。DiffGram 形式を使用していない場合、このプロパティによる影響はありません。

%XML.DataSetOpens in a new tab は、CaseSensitive プロパティも提供します。これは、同じ名前の Microsoft データセット・プロパティに対応します。互換性の理由から、既定値は False です。

データセットとスキーマの XML としての表示

%XML.DataSetOpens in a new tab を拡張するデータセットには、XML の生成に使用できるユーティリティ・メソッドがあります。これらのメソッドはすべて現在のデバイスに書き込みます。

  • WriteXML() は、XML としてデータセットを書き込みます。オプションで、XML スキーマが前に付きます。このメソッドには、最上位の要素の名前、ネームスペースの使用、NULL の扱いなどを制御するオプションの引数があります。前のセクションの設定で指定されているように、既定では、このメソッドはデータセットの形式を考慮します。出力が DiffGram 形式かどうかなどを制御するオプションの引数に値を指定することによって、この結果を上書きできます。詳細は、%XML.DataSetOpens in a new tab のクラス・ドキュメントを参照してください。

  • XMLExport() は、データセットの XML スキーマを書き込み、その後ろに XML としてのデータセットを書き込みます。

  • WriteSchema() は、データセットの XML スキーマのみを書き込みます。

  • XMLSchema() は、データセット・クラスの Microsoft 専用の XML 表現を書き込みます。

XML 対応のオブジェクトからの XML スキーマ生成の詳細は、"Caché XML ツールの使用法" を参照してください。

WSDL への影響

Caché Web サービスで %XML.DataSetOpens in a new tab を 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 と呼ばれるコマンドライン・ツールを使用できます。この手法によって、クライアントを生成するのに十分な情報を提供することができます。

ただし、どの場合でも、クライアントが適切な形式でメッセージを解釈または生成できるようにコードを記述するには、相当の作業が必要です。

FeedbackOpens in a new tab