Потребление набора данных из веб-службы XMLConsuming a DataSet from an XML Web Service

Объект DataSet не имеет привязки к каким-либо источникам, что позволяет частично упростить передачу данных через Интернет.The DataSet was architected with a disconnected design, in part to facilitate the convenient transport of data over the Internet. Набор данных является сериализуемым в том, что он может быть указан в качестве входных данных или выходных данных из веб-служб XML без дополнительного программирования, необходимого для потоковой передачи содержимого набора данных из веб-службы XML в клиент и обратно.The DataSet is "serializable" in that it can be specified as an input to or output from XML Web services without any additional coding required to stream the contents of the DataSet from an XML Web service to a client and back. Набор данных неявно преобразуется в XML-поток с помощью формата DiffGram, передается по сети, а затем перестраивается из потока XML в качестве набора данных на стороне получения.The DataSet is implicitly converted to an XML stream using the DiffGram format, sent over the network, and then reconstructed from the XML stream as a DataSet on the receiving end. Это обеспечивает очень простой и гибкий метод передачи и получения реляционных данных с помощью веб-служб XML.This gives you a very simple and flexible method for transmitting and returning relational data using XML Web services. Дополнительные сведения о формате DiffGram см. в разделе дельтами.For more information about the DiffGram format, see DiffGrams.

В следующем примере показано, как создать веб-службу XML и клиент, которые используют набор данных для передачи реляционных данных (включая измененные данные) и разрешения всех обновлений обратно в исходный источник данных.The following example shows how to create an XML Web service and client that use the DataSet to transport relational data (including modified data) and resolve any updates back to the original data source.

Примечание

При создании веб-службы XML следует всегда учитывать возможные вопросы безопасности.We recommend that you always consider security implications when creating an XML Web service. Сведения о защите веб-службы XML см. в разделе Защита веб-служб XML, созданных с помощью ASP.NET.For information on securing an XML Web service, see Securing XML Web Services Created Using ASP.NET.

Создание веб-службы XML, которая возвращает и потребляет объект DataSetTo create an XML Web service that returns and consumes a DataSet

  1. Создайте веб-службу XML.Create the XML Web service.

    В этом примере создается веб-служба XML, которая возвращает данные, в данном случае список клиентов из базы данных Northwind и получает набор данных с обновлениями данных, которые веб-служба XML разрешается обратно в исходный источник данных.In the example, an XML Web service is created that returns data, in this case a list of customers from the Northwind database, and receives a DataSet with updates to the data, which the XML Web service resolves back to the original data source.

    Веб-служба XML предоставляет два следующих метода: Клиенты, чтобы получить список клиентов и кодедля разрешения обновлений обратно в источник данных.The XML Web service exposes two methods: GetCustomers, to return the list of customers, and UpdateCustomers, to resolve updates back to the data source. Веб-служба XML хранится в файле на веб-сервере DataSetSample.asmx.The XML Web service is stored in a file on the Web server called DataSetSample.asmx. В следующем коде описано содержимое файла DataSetSample.asmx.The following code outlines the contents of 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;  
      }  
    }  
    

    В типичном сценарии метод коде будет написан для перехвата нарушений оптимистической блокировки.In a typical scenario, the UpdateCustomers method would be written to catch optimistic concurrency violations. Для простоты в данном примере это опущено.For simplicity, the example does not include this. Дополнительные сведения о оптимистичном параллелизме см. в разделе Оптимистическая блокировка.For more information about optimistic concurrency, see Optimistic Concurrency.

  2. Создайте посредник веб-службы XML.Create an XML Web service proxy.

    Клиентам веб-службы XML необходим посредник SOAP, чтобы использовать предоставленные методы.Clients of the XML Web service require a SOAP proxy in order to consume the exposed methods. Этот посредник может быть создан с помощью среды Visual Studio.You can have Visual Studio generate this proxy for you. Если задать веб-ссылку на существующую веб-службу из Visual Studio, все действия, описанные в этом шаге, будут производиться незаметно.By setting a Web reference to an existing Web service from within Visual Studio, all the behavior described in this step occurs transparently. Если требуется создать класс посредника самостоятельно, читайте этот раздел далее.If you want to create the proxy class yourself, continue with this discussion. Однако в большинстве случаев достаточно создать класс посредника для клиентского приложения с помощью Visual Studio.In most circumstances, however, using Visual Studio to create the proxy class for the client application is sufficient.

    Посредник можно создать с помощью средства WSDL.A proxy can be created using the Web Services Description Language Tool. Например, если веб-служба XML предоставляется по URL-адресу http://myserver/data/DataSetSample.asmx, выполните следующую команду, чтобы создать Visual Basic прокси .NET с пространством имен дссампле и сохранить его в файле Sample. vb.For example, if the XML Web service is exposed at the URL http://myserver/data/DataSetSample.asmx, issue a command such as the following to create a Visual Basic .NET proxy with a namespace of WebData.DSSample and store it in the file sample.vb.

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

    Чтобы создать посредник C# в файле sample.cs, выполните следующую команду.To create a C# proxy in the file sample.cs, issue the following command.

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

    После создания посредник можно будет скомпилировать как библиотеку и импортировать в клиент веб-службы XML.The proxy can then be compiled as a library and imported into the XML Web service client. Чтобы скомпилировать код посредника Visual Basic .NET, хранящийся в файле sample.vb, в файл sample.dll, выполните следующую команду.To compile the Visual Basic .NET proxy code stored in sample.vb as sample.dll, issue the following command.

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

    Чтобы скомпилировать код посредника C#, хранящийся в файле sample.cs, в файл sample.dll, выполните следующую команду.To compile the C# proxy code stored in sample.cs as sample.dll, issue the following command.

    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.Create an XML Web service client.

    Если вы хотите, чтобы Visual Studio автоматически создавала класс прокси веб-службы, просто создайте клиентский проект, а в окне обозреватель решений щелкните правой кнопкой мыши проект, выберите команду Добавить веб-ссылкуи выберите веб-службу из списка доступных веб-служб. службы (для этого может потребоваться указать адрес конечной точки веб-службы, если веб-служба недоступна в текущем решении или на текущем компьютере). Если посредник веб-службы XML создается самостоятельно (как описано в предыдущем шаге), его можно импортировать в код клиента и воспользоваться методами веб-службы XML.If you want to have Visual Studio generate the Web service proxy class for you, simply create the client project, and, in the Solution Explorer window, right-click the project, click Add Web Reference, and select the Web service from the list of available Web services (this may require supplying the address of the Web service endpoint, if the Web service isn't available within the current solution, or on the current computer.) If you create the XML Web service proxy yourself (as described in the previous step), you can import it into your client code and consume the XML Web service methods. Следующий пример кода импортирует библиотеку прокси-сервера, вызывает клиентов для получения списка клиентов, добавляет нового клиента, а затем возвращает набор данных с обновлениями коде.The following sample code imports the proxy library, calls GetCustomers to get a list of customers, adds a new customer, and then returns a DataSet with the updates to UpdateCustomers.

    Обратите внимание, что в примере передается набор данных , возвращаемый DataSet. Changed в коде , так как только измененные строки необходимо передать в коде.Notice that the example passes the DataSet returned by DataSet.GetChanges to UpdateCustomers because only modified rows need to be passed to UpdateCustomers. Коде возвращает разрешенный набор данных, который затем можно объединить в существующий набор данных , чтобы включить в него разрешенные изменения и любые сведения об ошибках строк из обновления.UpdateCustomers returns the resolved DataSet, which you can then Merge into the existing DataSet to incorporate the resolved changes and any row error information from the update. В следующем коде предполагается, что вы использовали Visual Studio для создания веб-ссылки и переименовали веб-ссылку на Дссампле в диалоговом окне " Добавление веб-ссылки ".The following code assumes that you have used Visual Studio to create the Web reference, and that you have renamed the Web reference to DsSample in the Add Web Reference dialog box.

    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();  
      }  
    }  
    

    Если класс посредника создается самостоятельно, следует выполнить следующие дополнительные шаги.If you decide to create the proxy class yourself, you must take the following extra steps. Чтобы скомпилировать образец, предоставьте созданную библиотеку посредника (sample.dll) и связанные с ней библиотеки .NET.To compile the sample, supply the proxy library that was created (sample.dll) and the related .NET libraries. Чтобы скомпилировать версию Visual Basic .NET образца, которая хранится в файле client.vb, выполните следующую команду.To compile the Visual Basic .NET version of the sample, stored in the file client.vb, issue the following command.

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

    Чтобы скомпилировать версию C# образца, которая хранится в файле client.cs, выполните следующую команду.To compile the C# version of the sample, stored in the file client.cs, issue the following command.

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

См. такжеSee also