次の方法で共有


XML Web サービスから DataSet を使用する

DataSetは、インターネット経由でのデータの便利な転送を容易にするために、切断された設計で設計されました。 DataSet は、XML Web サービスへの入力または XML Web サービスからの出力として指定できる点で、DataSet の内容を XML Web サービスからクライアントにストリーミングして戻すために追加のコーディングを必要とせずに、"シリアル化可能" です。 DataSet は、DiffGram 形式を使用して XML ストリームに暗黙的に変換され、ネットワーク経由で送信された後、受信側の DataSet として XML ストリームから再構築されます。 これにより、XML Web サービスを使用してリレーショナル データを簡単かつ柔軟に送信および返す方法が提供されます。 DiffGram 形式の詳細については、「 DiffGrams」を参照してください。

次の例は、 DataSet を使用してリレーショナル データ (変更されたデータを含む) を転送し、更新を元のデータ ソースに解決する XML Web サービスとクライアントを作成する方法を示しています。

XML Web サービス呼び出しの一部として DataSet または DataTable インスタンスを送信することは、入力が信頼されていない場合は安全ではありません。 詳細については、「DataSet と DataTable のセキュリティ ガイダンス」を参照してください。 また、XML Web サービスを作成するときは、セキュリティへの影響を常に考慮することをお勧めします。 XML Web サービスのセキュリティ保護については、「 ASP.NET を使用して作成された XML Web サービスのセキュリティ保護」を参照してください。

XML Web サービスを作成する

  1. XML Web サービスを作成します。

    この例では、データ (この場合は Northwind データベースの顧客の一覧) を返す XML Web サービスが作成され、データが更新された DataSet が 受信され、XML Web サービスは元のデータ ソースに解決されます。

    XML Web サービスは、 GetCustomers という 2 つのメソッドを公開して顧客の一覧を返し、 UpdateCustomers を使用してデータ ソースへの更新を解決します。 XML Web サービスは、DataSetSample.asmx という Web サーバー上のファイルに格納されます。 次のコードは、DataSetSample.asmx の内容の概要を示しています。

    <% @ WebService Language = "vb" Class = "Sample" %>  
    Imports System  
    Imports System.Data  
    Imports System.Data.SqlClient  
    Imports System.Web.Services  
    
    <WebService(Namespace:="http://microsoft.com/webservices/")> _  
    Public Class Sample  
    
    Public connection As SqlConnection = New SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind")  
    
      <WebMethod( Description := "Returns Northwind Customers", EnableSession := False )> _  
      Public Function GetCustomers() As DataSet  
        Dim adapter As SqlDataAdapter = New SqlDataAdapter( _  
          "SELECT CustomerID, CompanyName FROM Customers", connection)  
    
        Dim custDS As DataSet = New DataSet()  
        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey  
        adapter.Fill(custDS, "Customers")  
    
        Return custDS  
      End Function  
    
      <WebMethod( Description := "Updates Northwind Customers", EnableSession := False )> _  
      Public Function UpdateCustomers(custDS As DataSet) As DataSet  
        Dim adapter As SqlDataAdapter = New SqlDataAdapter()  
    
        adapter.InsertCommand = New SqlCommand( _  
          "INSERT INTO Customers (CustomerID, CompanyName) " & _  
          "Values(@CustomerID, @CompanyName)", connection)  
        adapter.InsertCommand.Parameters.Add( _  
          "@CustomerID", SqlDbType.NChar, 5, "CustomerID")  
        adapter.InsertCommand.Parameters.Add( _  
          "@CompanyName", SqlDbType.NChar, 15, "CompanyName")  
    
        adapter.UpdateCommand = New SqlCommand( _  
          "UPDATE Customers Set CustomerID = @CustomerID, " & _  
          "CompanyName = @CompanyName WHERE CustomerID = " & _  
          @OldCustomerID", connection)  
        adapter.UpdateCommand.Parameters.Add( _  
          "@CustomerID", SqlDbType.NChar, 5, "CustomerID")  
        adapter.UpdateCommand.Parameters.Add( _  
          "@CompanyName", SqlDbType.NChar, 15, "CompanyName")  
    
        Dim parameter As SqlParameter = _  
          adapter.UpdateCommand.Parameters.Add( _  
          "@OldCustomerID", SqlDbType.NChar, 5, "CustomerID")  
        parameter.SourceVersion = DataRowVersion.Original  
    
        adapter.DeleteCommand = New SqlCommand( _  
          "DELETE FROM Customers WHERE CustomerID = @CustomerID", _  
          connection)  
        parameter = adapter.DeleteCommand.Parameters.Add( _  
          "@CustomerID", SqlDbType.NChar, 5, "CustomerID")  
        parameter.SourceVersion = DataRowVersion.Original  
    
        adapter.Update(custDS, "Customers")  
    
        Return custDS  
      End Function  
    End Class  
    
    <% @ WebService Language = "C#" Class = "Sample" %>  
    using System;  
    using System.Data;  
    using System.Data.SqlClient;  
    using System.Web.Services;  
    
    [WebService(Namespace="http://microsoft.com/webservices/")]  
    public class Sample  
    {  
      public SqlConnection connection = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind");  
    
      [WebMethod( Description = "Returns Northwind Customers", EnableSession = false )]  
      public DataSet GetCustomers()  
      {  
        SqlDataAdapter adapter = new SqlDataAdapter(  
          "SELECT CustomerID, CompanyName FROM Customers", connection);  
    
        DataSet custDS = new DataSet();  
        adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;  
        adapter.Fill(custDS, "Customers");  
    
        return custDS;  
      }  
    
      [WebMethod( Description = "Updates Northwind Customers",  
        EnableSession = false )]  
      public DataSet UpdateCustomers(DataSet custDS)  
      {  
        SqlDataAdapter adapter = new SqlDataAdapter();  
    
        adapter.InsertCommand = new SqlCommand(  
          "INSERT INTO Customers (CustomerID, CompanyName) " +  
          "Values(@CustomerID, @CompanyName)", connection);  
        adapter.InsertCommand.Parameters.Add(  
          "@CustomerID", SqlDbType.NChar, 5, "CustomerID");  
        adapter.InsertCommand.Parameters.Add(  
          "@CompanyName", SqlDbType.NChar, 15, "CompanyName");  
    
        adapter.UpdateCommand = new SqlCommand(  
          "UPDATE Customers Set CustomerID = @CustomerID, " +  
          "CompanyName = @CompanyName WHERE CustomerID = " +  
          "@OldCustomerID", connection);  
        adapter.UpdateCommand.Parameters.Add(  
          "@CustomerID", SqlDbType.NChar, 5, "CustomerID");  
        adapter.UpdateCommand.Parameters.Add(  
          "@CompanyName", SqlDbType.NChar, 15, "CompanyName");  
        SqlParameter parameter = adapter.UpdateCommand.Parameters.Add(  
          "@OldCustomerID", SqlDbType.NChar, 5, "CustomerID");  
        parameter.SourceVersion = DataRowVersion.Original;  
    
        adapter.DeleteCommand = new SqlCommand(  
        "DELETE FROM Customers WHERE CustomerID = @CustomerID",  
         connection);  
        parameter = adapter.DeleteCommand.Parameters.Add(  
          "@CustomerID", SqlDbType.NChar, 5, "CustomerID");  
        parameter.SourceVersion = DataRowVersion.Original;  
    
        adapter.Update(custDS, "Customers");  
    
        return custDS;  
      }  
    }  
    

    一般的なシナリオでは、UpdateCustomers メソッドはオプティミスティックコンカレンシーの違反を捕捉するように記述される。 わかりやすくするために、この例にはこれが含まれていません。 オプティミスティック コンカレンシーの詳細については、「 オプティミスティック コンカレンシー」を参照してください。

  2. XML Web サービス プロキシを作成します。

    XML Web サービスのクライアントは、公開されたメソッドを使用するために SOAP プロキシを必要とします。 Visual Studio でこのプロキシを生成してもらうことができます。 Visual Studio 内から既存の Web サービスへの Web 参照を設定すると、この手順で説明するすべての動作が透過的に行われます。 プロキシ クラスを自分で作成する場合は、この説明に進んでください。 ただし、ほとんどの状況では、Visual Studio を使用してクライアント アプリケーションのプロキシ クラスを作成するだけで十分です。

    プロキシは、Web サービス記述言語ツールを使用して作成できます。 たとえば、XML Web サービスが URL http://myserver/data/DataSetSample.asmxで公開されている場合は、次のようなコマンドを発行して、 WebData.DSSample の名前空間を持つ Visual Basic .NET プロキシを作成し、ファイル sample.vbに格納します。

    wsdl /l:VB -out:sample.vb http://myserver/data/DataSetSample.asmx /n:WebData.DSSample  
    

    ファイル sample.csで C# プロキシを作成するには、次のコマンドを発行します。

    wsdl -l:CS -out:sample.cs http://myserver/data/DataSetSample.asmx -n:WebData.DSSample  
    

    その後、プロキシをライブラリとしてコンパイルし、XML Web サービス クライアントにインポートできます。 sample.vbに格納されている Visual Basic .NET プロキシ コードを sample.dllとしてコンパイルするには、次のコマンドを発行します。

    vbc -t:library -out:sample.dll sample.vb -r:System.dll -r:System.Web.Services.dll -r:System.Data.dll -r:System.Xml.dll  
    

    sample.csに格納されている C# プロキシ コードを sample.dllとしてコンパイルするには、次のコマンドを発行します。

    csc -t:library -out:sample.dll sample.cs -r:System.dll -r:System.Web.Services.dll -r:System.Data.dll -r:System.Xml.dll  
    
  3. XML Web サービス クライアントを作成します。

    Visual Studio で Web サービス プロキシ クラスを生成する場合は、クライアント プロジェクトを作成し、ソリューション エクスプローラー ウィンドウでプロジェクトを右クリックし、[ 追加>Service Reference] を選択します。 [ サービス参照の追加 ] ダイアログ ボックスで、[ 詳細設定] を選択し、[ Web 参照の追加] を選択します。 使用可能な Web サービスの一覧から Web サービスを選択します (Web サービスが現在のソリューションまたは現在のコンピューターで使用できない場合は、Web サービス エンドポイントのアドレスを指定する必要があります)。 (前の手順で説明したように) XML Web サービス プロキシを自分で作成した場合は、それをクライアント コードにインポートし、XML Web サービス メソッドを使用できます。

    次のサンプル コードでは、プロキシ ライブラリをインポートし、GetCustomers を呼び出して顧客の一覧を取得し、新しい顧客を追加した後、UpdateCustomers の更新プログラムを含む DataSet を返します。

    この例では、変更された行のみを UpdateCustomers に渡す必要があるため、DataSet.GetChanges によって返される DataSetUpdateCustomers に渡します。 UpdateCustomers は解決された DataSet を返します。これにより、既存の DataSetマージして、解決された変更と更新プログラムからの行エラー情報を組み込むことができます。 次のコードは、Visual Studio を使用して Web 参照を作成し、[Web 参照の 追加 ] ダイアログ ボックスで Web 参照の名前を DsSample に変更したことを前提としています。

    Imports System  
    Imports System.Data  
    
    Public Class Client  
    
      Public Shared Sub Main()  
        Dim proxySample As New DsSample.Sample ()  ' Proxy object.  
        Dim customersDataSet As DataSet = proxySample.GetCustomers()  
        Dim customersTable As DataTable = _  
          customersDataSet.Tables("Customers")  
    
        Dim rowAs DataRow = customersTable.NewRow()  
        row("CustomerID") = "ABCDE"  
        row("CompanyName") = "New Company Name"  
        customersTable.Rows.Add(row)  
    
        Dim updateDataSet As DataSet = _  
          proxySample.UpdateCustomers(customersDataSet.GetChanges())  
    
        customersDataSet.Merge(updateDataSet)  
        customersDataSet.AcceptChanges()  
      End Sub  
    End Class  
    
    using System;  
    using System.Data;  
    
    public class Client  
    {  
      public static void Main()  
      {  
        Sample proxySample = new DsSample.Sample();  // Proxy object.  
        DataSet customersDataSet = proxySample.GetCustomers();  
        DataTable customersTable = customersDataSet.Tables["Customers"];  
    
        DataRow row = customersTable.NewRow();  
        row["CustomerID"] = "ABCDE";  
        row["CompanyName"] = "New Company Name";  
        customersTable.Rows.Add(row);  
    
        DataSet updateDataSet = new DataSet();  
    
        updateDataSet =
          proxySample.UpdateCustomers(customersDataSet.GetChanges());  
    
        customersDataSet.Merge(updateDataSet);  
        customersDataSet.AcceptChanges();  
      }  
    }  
    

    プロキシ クラスを自分で作成する場合は、次の追加手順を実行する必要があります。 サンプルをコンパイルするには、作成されたプロキシ ライブラリ (sample.dll) と関連する .NET ライブラリを指定します。 ファイル client.vbに格納されているサンプルの Visual Basic .NET バージョンをコンパイルするには、次のコマンドを発行します。

    vbc client.vb -r:sample.dll -r:System.dll -r:System.Data.dll -r:System.Xml.dll -r:System.Web.Services.dll  
    

    ファイル client.csに格納されているサンプルの C# バージョンをコンパイルするには、次のコマンドを発行します。

    csc client.cs -r:sample.dll -r:System.dll -r:System.Data.dll -r:System.Xml.dll -r:System.Web.Services.dll  
    

こちらも参照ください