xml データ型と CLR ユーザー定義型の処理

この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。

SQL Server 2005 以降のネイティブ XML Web サービスでは、xml データ型や CLR (共通言語ランタイム) ユーザー定義型などの型を渡す場合、いくつか追加の開発作業が必要です。このトピックでは、XML Web サービスに基づくアプリケーションが、Web メソッドとパラメータ化クエリの xml データ型や CLR ユーザー定義型と連携できるようにするために必要となる作業について説明します。

注意

このトピックは、SQL Server のネイティブ XML Web サービスの配置について基本的な知識があるユーザーを対象としています。ユーザーは、エンドポイントの作成、Web メソッドとしての SQL プログラミング機能の公開、他の組み込み SQL 型を使用する SQL Server 用の基本的な Web クライアント アプリケーションの記述などの作業について理解している必要があります。この情報を確認する場合は、「ネイティブ XML Web サービスの概念」、「ネイティブ XML Web サービスの配置」、および「ネイティブ XML Web サービスを使用する際の推奨事項」を参照してください。

Web クライアント アプリケーションでの xml データ型の処理

Web クライアント アプリケーションで xml データ型を正しく処理するために、次のシナリオのどちらが適用されるかによって、細かい点が異なります。

  • エンドポイントで Web メソッドとして公開されているストアド プロシージャを扱う。

  • エンドポイントの SQL バッチ (sqlbatch) 機能を使用してパラメータ化クエリを実行する。

どちらのシナリオでも、myEndpoint**::xml** 構造体を使用し、値を設定することにより、xml データ型のパラメータ化インスタンスを処理する必要があります。この構造体では、myEndpoint がエンドポイントの実際の名前を表します。エンドポイントは、xml データ型のインスタンスがクライアント側のコード経由で渡されるときに使用されます。この構造体は、エンドポイント Web プロキシ クラスで宣言します。

Web メソッドを公開するエンドポイントへの Web 参照を Visual Studio プロジェクトに追加または更新すると、myEndpoint**::xml** 構造体が作成されます。ただし、クライアント側のアプリケーション コードで使用している XML が型指定されているかどうかに応じて、カスタム Web プロキシ クラスで最初に生成された myEndpoint**::xml** 構造体に適切に値を設定する必要があります。

Web メソッドの型指定されていない xml データ型パラメータ インスタンスの場合は、myEndpoint**::xml** 構造体では、そのインスタンスがプロキシ クラスの System.Xml.XmlNode 型の配列として公開されます。したがって、xml データ型パラメータ インスタンスに渡すには、XML ノードの配列を手動で作成して値を設定するか、可能であれば System.Xml.XmlDocumentFragment を使用します。詳細については、「Visual Studio クライアント アプリケーションでの xml データ型の使用」を参照してください。

Web メソッドの型指定された xml の場合は、カスタム型が Web プロキシ クラスで生成され、メソッド名と Type という語が連結され、その後にパラメータ名が続く形式で名前が付けられます。たとえば、Web メソッドが GetXmlInfo という名前で公開され、このメソッドが型指定された XML を入力として渡すために T という名前の xml データ型パラメータを受け取る場合、Web プロキシ クラスで公開されるカスタム型の名前は GetXmlInfoTypeT になります。このカスタム型は myEndpoint**::xml** 構造体から継承されるので、同様に、型指定された XML が System.Xml.XmlNode という配列で公開されます。

パラメータ化クエリでの xml データ型の処理は、Web メソッドでの xml データ型の処理と似ています。ただし、型指定された XML は、型指定されていない XML で使用されている型と同じ型 (myEndpoint**::xml**) を使用してクライアントから渡される必要があります。

myEndpoint**::xml** 構造体の準備が完了したら、この定義済みの構造体の中で xml データ型インスタンスを System.Xml.XmlNode という配列として公開できます。その後、このデータ型インスタンスが SqlParameter.Value オブジェクトに含められます。

パラメータ化クエリには SQL バッチ機能が必要です。そのため、次のような準備作業も新たに必要になる場合があります。

  • SQL を使用できるようにエンドポイントを設定する必要があります。つまり、エンドポイントを作成または変更するときには、BATCHES=ENABLED が使用されます。

  • Web プロキシ クラスでは、バッチが有効なエンドポイントに Web 参照を追加または更新するときに、sqlbatch() メソッドが含められます。

型指定された XML パラメータの場合、Web プロキシ クラスの sqlbatch() メソッドが更新され、System.Data.SqlClient.SqlParameter オブジェクトへの XML スキーマ コレクションの登録に関連する追加のプロパティ (XmlSchemaCollectionDatabase、XmlSchemaCollectionName、および XmlSchemaCollectionOwningSchema) の設定が含められます。

注意

xml データ型を公開する Web メソッドとパラメータ化クエリの場合、どちらも出力で (オブジェクトの配列の一部として) System.Data.DataSet が返され、結果を目に見える形で表すためにクライアント アプリケーションでその内容を DataGrid に配置する場合、Web プロキシ型 (myEndpoint::xml) を使用するのではなく CLR System.Data.SqlTypes.SqlXml 型を DataSet で使用します。

Web クライアント アプリケーションを使用した CLR ユーザー定義型の処理

Web クライアント アプリケーションで CLR ユーザー定義型を処理するには、次の手順を完了する必要があります。

  1. CLR ユーザー定義型を記述し、MyType.dll などの DLL にコンパイルします。

    Visual Studio 2005 で、CLR ユーザー定義型 (クラスまたは構造体) を記述し、アセンブリにコンパイルします。ユーザー定義型を実装する場合、この型アセンブリが SQL Server の要件に従っている必要があります。これにより、SQL Server のインスタンスにアセンブリをインストールおよび登録できるようになります。詳細については、「CLR ユーザー定義型」の「UDT の実装要件」を参照してください。

  2. XML シリアライザ コンパニオン DLL を生成するには、IXMLSerializable を実装していない場合は、型アセンブリ DLL で Sgen.exe を実行します。これにより、MyType.XmlSerializers.dll などの名前の DLL が生成されます。

    SQL Server で機能するために CLR ユーザー定義型の基本要件を満たすことに加えて、SQL Server のネイティブ XML Web サービスと連携するために CLR ユーザー定義型で XML シリアル化を可能にする必要もあります。詳細については、「CLR ユーザー定義型」の「XML シリアル化」を参照してください。

  3. CREATE ASSEMBLY を使用して、型アセンブリ DLL を SQL Server のインスタンスにインストールします。

    IXMLSerializable を実装しないで手順 2. を完了した場合は、CREATE ASSEMBLY を使用して XML シリアライザ コンパニオン DLL も SQL Server のインスタンスにインストールする必要があります。

  4. 前述と同様の手順で、CLR ユーザー定義型を XML にシリアル化して、myEndpoint**::xml** 構造体に含めます。

    サーバーで CLR ユーザー定義型がインストールされた後、その CLR ユーザー定義型のインスタンスをネイティブ XML Web サービス クライアント アプリケーションから SQL Server に渡すには、まず、CLR ユーザー定義型を XML 形式にシリアル化し、それを XML構造体に格納する必要があります。

    次のコードでは、CLR ユーザー定義型を XML 形式にシリアル化し、それを XML 要素 (System.Xml.XmlElement) に配置する方法を示しています。

    // Create the user-defined type class on the client.
    SqlString s = new SqlString("0:0");
    UdtClientApp.Point pnt = Point.Parse(s);
    // Invoke the method and pass in a user-defined type.You will need
    // to convert this to XmlElement before you can pass it to SQL Server.
    System.IO.MemoryStream writer = new System.IO.MemoryStream();
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(UdtClientApp.Point));
    serializer.Serialize(writer, pnt);
    writer.Seek(0, System.IO.SeekOrigin.Begin);
    System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
    xmlDoc.Load(writer);
    System.Xml.XmlElement udtXml = xmlDoc.DocumentElement;
    
  5. CLR ユーザー定義型がクライアント上に存在するかどうかによって、出力パラメータを CLR ユーザー定義型 XML 形式から、元のユーザー定義型形式へシリアル化の解除が必要になる場合もあります。

    次のコードでは、クライアント側コードでユーザー定義型 XML 形式から元の CLR ユーザー定義型にシリアル化解除する方法を示しています。この例では、CLR ユーザー定義型は Point です。

    Object[] results = proxy.GetPointUdt(Convert.ToInt16(textBox1.Text), ref udtXml);
    //Deserialze the XML into user-defined type.
    TextReader reader = new StringReader(udtXml.OuterXml);
    // pnt was already defined as UdtClientApp.Point pnt = Point.Parse(s);
    pnt = (UdtClientApp.Point) serializer.Deserialize(reader);
    

    クライアントで CLR ユーザー定義型を型指定されていない XML として使用している場合は、このシリアル化解除を実行する必要はありません。

CLR ユーザー定義型は、xml データ型について説明したのと同様の方法で、パラメータとしてパラメータ化クエリに渡すことができます。XML シリアル化形式の CLR ユーザー定義型は、myEndpoint**::xml** 型を使用してクライアントから渡す必要があります。

CLR ユーザー定義型を含むパラメータ化クエリにより、さまざまな値が System.Data.SqlClient.SqlParameter 構造体で設定されます。たとえば、次のプロパティ設定が CLR ユーザー定義型に使用されます。

  • SqlDbType プロパティには、Udt の値を設定する必要があります。

  • ClrTypeName プロパティは、3 つの要素で構成される SQL Server 修飾名 (MyDatabase**.MySchema.**MyUdtType) に設定する必要があります。これは、インストール済みのユーザー定義型の名前で、SQL Server のインスタンスで登録されている名前と同じです。