XML Web サービスからの DataSet の使用
DataSet は、非接続型デザインで設計されています。インターネットで簡単にデータを転送するのが目的の一部です。DataSet および DataTable は、DataSet の内容を XML Web サービスからクライアントに (およびその逆方向に) ストリーム転送するためのコードを追加せずに XML Web サービスへの入力または出力として指定できるという点で、"シリアル化可能" です。DataSet は、DiffGram 形式を使用して暗黙に XML ストリームに変換され、ネットワーク経由で送信されます。その後、受信側で XML ストリームから DataSet として再構築されます。これにより、XML Web サービスを使用してリレーショナル データを送信および返送する、たいへん簡単で柔軟性のある方法が提供されます。DiffGram 形式の詳細については、「DiffGram」を参照してください。
XML Web サービスと XML Web サービスのクライアント (DataSet を使用してリレーショナル データを転送し、更新内容を元のデータ ソースに反映させるクライアント) を作成する手順を次の例に示します。
メモ XML Web サービスを作成する場合は、常にセキュリティへの影響を考慮する必要があります。XML Web サービスのセキュリティについては、「ASP.NET を使用して作成した XML Web サービスのセキュリティ」を参照してください。
DataSet を返し、処理する XML Web サービスを作成するには、次のようにします。
XML Web サービスを作成します。
この例では、データ (ここでは、Northwind データベースの顧客リスト) を返し、元のデータ ソースに反映させるデータ更新が格納されている DataSet を受け取る XML Web サービスを作成します。
この XML Web サービスは 2 つのメソッドを公開しています。顧客リストを返す GetCustomers と、更新をデータ ソースに反映させる 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:="https://microsoft.com/webservices/")> _ Public Class Sample Public nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind") <WebMethod( Description := "Returns Northwind Customers", EnableSession := False )> _ Public Function GetCustomers() As DataSet Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn) Dim custDS As DataSet = New DataSet() custDA.MissingSchemaAction = MissingSchemaAction.AddWithKey custDA.Fill(custDS, "Customers") GetCustomers = custDS End Function <WebMethod( Description := "Updates Northwind Customers", EnableSession := False )> _ Public Function UpdateCustomers(custDS As DataSet) As DataSet Dim custDA As SqlDataAdapter = New SqlDataAdapter() custDA.InsertCommand = New SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " & _ "Values(@CustomerID, @CompanyName)", nwindConn) custDA.InsertCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID") custDA.InsertCommand.Parameters.Add("@CompanyName", SqlDbType.NChar, 15, "CompanyName") custDA.UpdateCommand = New SqlCommand("UPDATE Customers Set CustomerID = @CustomerID, " & _ "CompanyName = @CompanyName WHERE CustomerID = @OldCustomerID", nwindConn) custDA.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID") custDA.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.NChar, 15, "CompanyName") Dim myParm As SqlParameter = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", SqlDbType.NChar, 5, "CustomerID") myParm.SourceVersion = DataRowVersion.Original custDA.DeleteCommand = New SqlCommand("DELETE FROM Customers WHERE CustomerID = @CustomerID", nwindConn) myParm = custDA.DeleteCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID") myParm.SourceVersion = DataRowVersion.Original custDA.Update(custDS, "Customers") UpdateCustomers = custDS End Function End Class [C#] <% @ WebService Language = "C#" Class = "Sample" %> using System; using System.Data; using System.Data.SqlClient; using System.Web.Services; [WebService(Namespace="https://microsoft.com/webservices/")] public class Sample { public SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"); [WebMethod( Description = "Returns Northwind Customers", EnableSession = false )] public DataSet GetCustomers() { SqlDataAdapter custDA = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn); DataSet custDS = new DataSet(); custDA.MissingSchemaAction = MissingSchemaAction.AddWithKey; custDA.Fill(custDS, "Customers"); return custDS; } [WebMethod( Description = "Updates Northwind Customers", EnableSession = false )] public DataSet UpdateCustomers(DataSet custDS) { SqlDataAdapter custDA = new SqlDataAdapter(); custDA.InsertCommand = new SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " + "Values(@CustomerID, @CompanyName)", nwindConn); custDA.InsertCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID"); custDA.InsertCommand.Parameters.Add("@CompanyName", SqlDbType.NChar, 15, "CompanyName"); custDA.UpdateCommand = new SqlCommand("UPDATE Customers Set CustomerID = @CustomerID, " + "CompanyName = @CompanyName WHERE CustomerID = @OldCustomerID", nwindConn); custDA.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID"); custDA.UpdateCommand.Parameters.Add("@CompanyName", SqlDbType.NChar, 15, "CompanyName"); SqlParameter myParm = custDA.UpdateCommand.Parameters.Add("@OldCustomerID", SqlDbType.NChar, 5, "CustomerID"); myParm.SourceVersion = DataRowVersion.Original; custDA.DeleteCommand = new SqlCommand("DELETE FROM Customers WHERE CustomerID = @CustomerID", nwindConn); myParm = custDA.DeleteCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID"); myParm.SourceVersion = DataRowVersion.Original; custDA.Update(custDS, "Customers"); return custDS; } }
代表的なシナリオでは、UpdateCustomers メソッドはオプティミスティック同時実行制御違反をキャッチするように記述されます。説明を簡単にするために、この例では UpdateCustmoers メソッドを省略しています。オプティミスティック同時実行制御の詳細については、「オプティミスティック同時実行制御」を参照してください。
XML Web サービス プロキシを作成します。
XML Web サービスのクライアントは、公開されたメソッドを使用するために SOAP プロキシを必要とします。プロキシは、Web サービス記述言語ツール (Wsdl.exe) を使用して作成できます。たとえば、XML Web サービスを 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 /: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
XML Web サービスのクライアントを作成します。
XML Web サービス プロキシを作成した後、それをクライアント コードにインポートし、XML Web サービスのメソッドを処理できます。プロキシ ライブラリをインポートし、GetCustomers を呼び出して顧客リストを取得し、新しい顧客を追加した後、更新内容が格納された DataSet を UpdateCustomers に返すサンプル コードを次に示します。この例では、変更された行だけを UpdateCustomers に渡す必要があるため、UpdateCustmoers には、DataSet.GetChanges によって返された DataSet が渡されることに注意してください。UpdateCustomers は解決された DataSet を返します。その後、この DataSet を既存の DataSet に Merge して、解決された変更と更新からの行エラー情報を取り込むことができます。
Imports System Imports System.Data Imports WebData.DSSample Public Class Client Public Shared Sub Main() Dim mySamp As Sample = New Sample() ' Proxy object. Dim myDS As DataSet = mySamp.GetCustomers() Dim myTable As DataTable = myDS.Tables("Customers") Dim newRow As DataRow = myTable.NewRow() newRow("CustomerID") = "ABCDE" newRow("CompanyName") = "New Company Name" myTable.Rows.Add(newRow) Dim updDS As DataSet = mySamp.UpdateCustomers(myDS.GetChanges()) myDS.Merge(updDS) myDS.AcceptChanges() End Sub End Class [C#] using System; using System.Data; using WebData.DSSample; public class Client { public static void Main() { Sample mySamp = new Sample(); // Proxy object. DataSet myDS = mySamp.GetCustomers(); DataTable myTable = myDS.Tables["Customers"]; DataRow newRow = myTable.NewRow(); newRow["CustomerID"] = "ABCDE"; newRow["CompanyName"] = "New Company Name"; myTable.Rows.Add(newRow); DataSet updDS = new DataSet(); updDS = mySamp.UpdateCustomers(myDS.GetChanges()); myDS.Merge(updDS); myDS.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
参照
サンプル ADO.NET シナリオ | ADO.NET を使用したデータのアクセス | .NET Framework データ プロバイダによるデータのアクセス | DataSet の作成および使用 | DataTable の作成と使用 | DataAdapter からの DataSet の読み込み | DataAdapter および DataSet によるデータベースの更新 | DataAdapter によるパラメータの使用