다음을 통해 공유


XML 웹 서비스에서 DataSet 사용

DataSet는 데이터가 인터넷을 통해 편리하게 전송될 수 있도록 하기 위해 부분적으로 분리된 설계로 디자인되었습니다. DataSet은(는) 추가 코딩 없이 XML 웹 서비스에 대한 입력이나 출력으로 지정할 수 있는 측면에서 "직렬화 가능"합니다. XML 웹 서비스의 DataSet 내용을 클라이언트로 스트리밍할 수 있습니다. DiffGram 형식을 사용하여 DataSet가 암시적으로 XML 스트림으로 변환된 후, 네트워크를 통해 전송되고 수신 측에서 XML 스트림으로부터 DataSet로 다시 구성됩니다. 이를 통해 XML 웹 서비스를 사용하여 관계형 데이터를 전송하고 반환하는 간단하고 유연한 방법을 사용할 수 있습니다. DiffGram 형식에 대한 자세한 내용은 DiffGrams를 참조하세요.

다음 예제에서는 관계형 데이터(수정된 데이터 포함)를 전송하고 원래 데이터 원본으로 업데이트를 다시 확인하는 데 사용하는 DataSet XML 웹 서비스 및 클라이언트를 만드는 방법을 보여 줍니다.

비고

DataSet 또는 DataTable 인스턴스를 XML 웹 서비스 호출의 일부로 전송하는 것이 입력이 신뢰할 수 없는 경우 안전하지 않습니다. 자세한 내용은 DataSet 및 DataTable 보안 지침을 참조하세요. 또한 XML 웹 서비스를 만들 때 항상 보안에 미치는 영향을 고려하는 것이 좋습니다. XML 웹 서비스 보안에 대한 자세한 내용은 ASP.NET 사용하여 만든 XML Web Services 보안 유지를 참조하세요.

XML 웹 서비스 만들기

  1. XML 웹 서비스를 만듭니다.

    이 예제에서는 특정 데이터베이스(Northwind)의 고객 목록을 반환하는 XML 웹 서비스를 생성하며, 데이터에 대한 DataSet 업데이트를 수신하여 XML 웹 서비스가 원래 데이터 원본과 동기화하도록 처리합니다.

    XML 웹 서비스는 두 가지 방법인 GetCustomers를 노출하여 고객 목록을 반환하고 UpdateCustomers를 사용하여 데이터 원본에 대한 업데이트를 다시 확인합니다. XML 웹 서비스는 DataSetSample.asmx라는 웹 서버의 파일에 저장됩니다. 다음 코드에서는 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 웹 서비스 프록시를 만듭니다.

    XML 웹 서비스의 클라이언트는 노출된 메서드를 사용하기 위해 SOAP 프록시가 필요합니다. Visual Studio에서 이 프록시를 생성할 수 있습니다. Visual Studio 내에서 기존 웹 서비스에 대한 웹 참조를 설정하면 이 단계에서 설명하는 모든 동작이 투명하게 수행됩니다. 프록시 클래스를 직접 만들려면 이 토론을 계속 진행합니다. 그러나 대부분의 경우 Visual Studio를 사용하여 클라이언트 애플리케이션에 대한 프록시 클래스를 만드는 것으로 충분합니다.

    웹 서비스 설명 언어 도구를 사용하여 프록시를 만들 수 있습니다. 예를 들어 XML 웹 서비스가 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 웹 서비스 클라이언트로 가져올 수 있습니다. 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.dllsample.cs 저장된 C# 프록시 코드를 컴파일하려면 다음 명령을 실행합니다.

    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 웹 서비스 클라이언트를 만듭니다.

    Visual Studio에서 웹 서비스 프록시 클래스를 생성하도록 하려면 클라이언트 프로젝트를 만들고 솔루션 탐색기 창에서 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 Add를 선택합니다>. 서비스 참조 추가 대화 상자에서 고급을 선택한 다음 웹 참조 추가를 선택합니다. 사용 가능한 웹 서비스 목록에서 웹 서비스를 선택합니다(현재 솔루션 또는 현재 컴퓨터에서 웹 서비스를 사용할 수 없는 경우 웹 서비스 엔드포인트의 주소를 제공해야 할 수 있음). 이전 단계에서 설명한 대로 XML 웹 서비스 프록시를 직접 만드는 경우 클라이언트 코드로 가져와서 XML 웹 서비스 메서드를 사용할 수 있습니다.

    다음 샘플 코드는 프록시 라이브러리를 가져오고, 고객 목록을 가져오기 위해 호출 GetCustomers 하고, 새 고객을 추가한 다음, DataSet에 대한 업데이트와 함께 반환 합니다.

    이 예제에서는 수정된 행만 DataSet 전달해야 하므로 UpdateCustomers에서 반환된 행을 전달 합니다. UpdateCustomers는 해결된 DataSet을 반환하며, 이를 기존 Merge 데이터 세트에 통합하여 업데이트에서 확인된 변경 내용과 행 오류 정보를 통합할 수 있습니다DataSet. 다음 코드에서는 Visual Studio를 사용하여 웹 참조를 만들었으며 웹 참조 추가 대화 상자에서 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
    

참고하십시오