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 웹 서비스 만들기
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메서드를 작성할 것입니다. 간단히 하기 위해 예제에는 이 내용이 포함되지 않습니다. 낙관적 동시성에 대한 자세한 내용은 낙관적 동시성을 참조하세요.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.dllsample.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.dllXML 웹 서비스 클라이언트를 만듭니다.
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 Classusing 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