非標準の OData サービスに接続する



CData ADO.NET Provider for OData を使用すると、Web サービスをフルマネージド ADO.NET データソースとして利用できます。ネイティブの ADO.NET ツールから、ほぼすべての OData サービスにアクセスできるようになります。以下の手順に従うことで、OData プロトコルに完全には準拠していない OData データソースにもアクセスできます。この記事では、メタデータ取得のサポートなど、一般的な機能の一部が実装されていない Microsoft Research サービス のサポートを追加する方法を説明します。

カスタムスキーマファイルを定義する

CData のプロバイダーでは、データソース内のテーブルのメタデータを定義するカスタムスキーマファイルを作成できます。これは、"$metadata" サービスメタデータドキュメントを実装していない OData サービスにアクセスする場合に便利です。また、メタデータをローカルに保存すると、データソースから毎回取得する必要がなくなるため、パフォーマンスが向上します。

以下の手順に従って、Microsoft Research サービスの Downloads テーブル用のスキーマファイルを作成してみましょう。

  1. 既存のスキーマをテンプレートとして使用します。インストールディレクトリの db フォルダに移動し、sys_data.rsd スキーマファイルをコピーします。新しいファイルには、接続するテーブルと同じ名前を付けます。
  2. 新しいファイル(Downloads.rsd)で、rsb:info タグ内のすべての行を削除します。rsb:info ノードの Title 属性を、ファイル名(.rsd 拡張子なし)と一致するように変更します。
  3. ブラウザでテーブルの URL(例: http://odata.research.microsoft.com/odata.svc/Downloads)にアクセスして、カラムのリストを取得します。OData データプロバイダーで最終的に取得したいすべてのテーブルが含まれた XML ドキュメントが返されるはずです。ブラウザで実際の XML を表示するには、ページのソースを確認する必要があるかもしれません。返されたエントリの1つの下にある m:properties ノードを探します。ここにある各子要素がスキーマのフィールドになります。
  4. アクセスしたいフィールドのカラムを定義します。attr エントリには、最低限 name 属性と xs:type 属性を指定します。Downloads テーブルの基本的な例を以下に示します。
    <attr name="ID"          xs:type="integer"  key="true" readonly="true" description="Downloads テーブルの主キー。" ></attr>
    <attr name="Name"        xs:type="string" ></attr>
    <attr name="Downloads"   xs:type="long" ></attr>

    上記の例では、以下のオプション属性を使用しています。

    • key: この属性は、フィールドを主キーとしてマークします。OData サービスが読み取り専用の場合、主キーは必須ではありません。
    • readonly: "true" に設定すると、この属性はフィールドの更新を禁止します。
    • description: この属性は説明を提供します。

    配列などの複合データ型を指定するには、以下の属性を追加できます。

    • other:int_ColumnName: 子要素を示すには、この属性にフィールドのパスを設定します。スラッシュの代わりにピリオドを使用します。
    • other:datasourcedatatype: この属性は、ルート要素の型に続いて子要素の EDM 型を指定します。

    例えば、Northwind の Suppliers テーブルでは、"Address_Street" の other:int_ColumnName は "Address.Street" で、other:datasourcedatatype は "ODataDemo.Address.Edm.String" となります。

  5. ページングをサポートするために、以下の行をそのまま追加します。
    <input name="rows@next" desc="ページングに使用されるシステムカラム。変更しないでください。">

完全なスクリプトを以下に示します。

<rsb:script xmlns:rsb="https://jp.cdata.com/ns/rsbscript/2">
  <rsb:info title="Downloads" description="これは、OData プロトコルに完全には準拠していない OData データソースに接続するためのカスタムスキーマファイルの作成方法を示すサンプルテーブルです。">
    <attr name="ID"               xs:type="integer"  key="true" />
    <attr name="Name"             xs:type="string"  ></attr>
    <attr name="Downloads"        xs:type="long"  ></attr>
    <attr name="FileName"         xs:type="string"  ></attr>
    <attr name="FileSize"         xs:type="integer"  ></attr>
    <attr name="Description"      xs:type="string"  ></attr>
    <attr name="Version"          xs:type="string"  ></attr>
    <attr name="Picture"          xs:type="string"  ></attr>
    <attr name="ResearchAreas"    xs:type="string"  ></attr>
    <attr name="Tags"             xs:type="string"  ></attr>
    <attr name="URL"              xs:type="string"  ></attr>
    <attr name="Eula"             xs:type="string"  ></attr>
    <attr name="DateUpdated "     xs:type="datetime"  ></attr>
    <attr name="DateCreated"      xs:type="datetime"  ></attr>

    <input name="rows@next" description="ページングに使用されるシステムカラム。変更しないでください。" />
  </rsb:info>

  <rsb:script method="GET">
    <rsb:call op="odataadoExecuteSearch" in="_input">
      <rsb:push />
    </rsb:call>
  </rsb:script>

    <rsb:script method="MERGE">
    <rsb:call op="odataadoExecuteUpdate" input="_input">
      <rsb:push />
    </rsb:call>
  </rsb:script>

  <rsb:script method="POST">
    <rsb:call op="odataadoExecuteInsert" input="_input">
     <rsb:push />
    </rsb:call>
  </rsb:script>

  <rsb:script method="DELETE">
    <rsb:call op="odataadoExecuteDelete" input="_input">
      <rsb:push />
    </rsb:call>
  </rsb:script>
</rsb:script>

テーブルをクエリする

カラムを追加すると、SELECT クエリで使用できるようになります。INSERT、UPDATE、DELETE が不要な場合は、それぞれ POST、MERGE、DELETE の rsb:script 要素を削除できます。

このスキーマファイルを CData のプロバイダーで使用するには、Location 接続プロパティをこのファイルが格納されているフォルダに設定します。

デフォルトの Id は OData アイテムの URL になります。サービスの m:properties 要素に Id フィールドが定義されていて、そちらを使用したい場合は、"Use Id URL" 接続文字列プロパティを False に設定できます。

INSERT、UPDATE、DELETE のサポートを追加する

この例の Microsoft サービスは、category ノードを提供しないため、INSERT、UPDATE、DELETE をサポートしていません。エントリに category 要素を割り当てるデータソースの場合は、_input.entityname と _input.schemanamespace の入力を設定することでこれらのサポートを得られます。これらの値は特定のテーブルに対してハードコードされます。これらの入力を以下の値に設定してください。

  • _input.entityname: この入力をテーブル名に設定します。
  • _input.schemanamespace: この入力を、対象テーブルのエントリの category 要素に設定します。もし Microsoft サービスがデータ操作クエリをサポートしていれば、http://odata.research.microsoft.com/odata.svc/Downloads の URL で category ノードを検索してスキーマ名前空間を取得できます。Microsoft Download テーブルの値は "OData.Models.Download" となります。

これらの値を取得したら、終了タグの直後、rsb:script method="GET" タグの前に、以下の2行を設定します。

<rsb:set attr="_input.entityname" value="Downloads" />
<rsb:set attr="_input.schemanamespace" value="OData.Models.Download" />