Consumir un DataSet desde un servicio web XMLConsume a DataSet from an XML web service

La arquitectura del DataSet tiene un diseño desconectado, en parte para facilitar el transporte de datos a través de Internet.The DataSet was architected with a disconnected design, in part to facilitate the convenient transport of data over the Internet. El DataSet es "serializable" en que se puede especificar como una entrada o salida de servicios Web XML sin ninguna codificación adicional necesaria para transmitir el contenido del conjunto de datos desde un servicio Web XML a un cliente y de nuevo.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. El DataSet se convierte implícitamente en una secuencia XML mediante el formato DiffGram, se envía a través de la red y, a continuación, se reconstruye de la secuencia XML como un DataSet en el extremo receptor.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. Esto proporciona un método muy sencillo y flexible para transmitir y devolver datos relacionales mediante servicios Web XML.This gives you a very simple and flexible method for transmitting and returning relational data using XML Web services. Para obtener más información sobre el formato DiffGram, consulte DiffGrams.For more information about the DiffGram format, see DiffGrams.

En el ejemplo siguiente se muestra cómo crear un servicio Web XML y un cliente que usan el dataSet para transportar datos relacionales (incluidos los datos modificados) y resolver las actualizaciones de nuevo al origen de datos original.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.

Nota

Al crear un servicio Web XML, es recomendable tener siempre en cuenta las implicaciones de seguridad.We recommend that you always consider security implications when creating an XML Web service. Para obtener información sobre cómo proteger un servicio Web XML, vea Proteger los servicios Web XML creados mediante ASP.NET.For information on securing an XML Web service, see Securing XML Web Services Created Using ASP.NET.

Crear un servicio web XMLCreate an XML web service

  1. Cree el servicio Web XML.Create the XML Web service.

    En el ejemplo, se crea un servicio Web XML que devuelve datos, en este caso una lista de clientes de la base de datos Northwind, y recibe un DataSet con actualizaciones de los datos, que el servicio Web XML resuelve en el origen de datos original.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.

    El servicio Web XML expone dos métodos: GetCustomers, para devolver la lista de clientes y UpdateCustomers, para resolver las actualizaciones al origen de datos.The XML Web service exposes two methods: GetCustomers, to return the list of customers, and UpdateCustomers, to resolve updates back to the data source. El servicio Web XML se almacena en un archivo del servidor web denominado DataSetSample.asmx.The XML Web service is stored in a file on the Web server called DataSetSample.asmx. En el siguiente código se describe el contenido de 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;  
      }  
    }  
    

    En un escenario típico, el UpdateCustomers método se escribiría para detectar infracciones de simultaneidad optimista.In a typical scenario, the UpdateCustomers method would be written to catch optimistic concurrency violations. Para simplificar, el ejemplo no lo incluye.For simplicity, the example does not include this. Para obtener más información acerca de la simultaneidad optimista, vea Simultaneidad optimista.For more information about optimistic concurrency, see Optimistic Concurrency.

  2. Cree un proxy de servicio Web XML.Create an XML Web service proxy.

    Los clientes del servicio Web XML necesitan un proxy SOAP para utilizar los métodos expuestos.Clients of the XML Web service require a SOAP proxy in order to consume the exposed methods. Visual Studio puede generar el proxy.You can have Visual Studio generate this proxy for you. Al establecer una referencia Web a un servicio Web existente desde Visual Studio, el comportamiento descrito en este paso se produce de forma transparente.By setting a Web reference to an existing Web service from within Visual Studio, all the behavior described in this step occurs transparently. Si desea crear la clase de proxy personalmente, continúe con la explicación.If you want to create the proxy class yourself, continue with this discussion. Sin embargo, el uso de Visual Studio para crear la clase de proxy para la aplicación cliente es suficiente en la mayoría de los casos.In most circumstances, however, using Visual Studio to create the proxy class for the client application is sufficient.

    Es posible crear un proxy con la herramienta Lenguaje de descripción de servicios Web.A proxy can be created using the Web Services Description Language Tool. Por ejemplo, si el servicio Web http://myserver/data/DataSetSample.asmxXML se expone en la dirección URL , emita un comando como el siguiente para crear un proxy de Visual Basic .NET con un espacio de nombres de WebData.DSSample y almacenarlo en el archivo 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  
    

    Para crear un proxy de C# en el archivo sample.cs, hay que utilizar el comando siguiente.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  
    

    El proxy puede compilarse como una biblioteca e importarse en el cliente del servicio Web XML.The proxy can then be compiled as a library and imported into the XML Web service client. Para compilar el código de proxy de Visual Basic .NET almacenado en sample.vb como sample.dll, hay que utilizar el siguiente comando.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  
    

    Para compilar el código de proxy de C# almacenado en sample.cs como sample.dll, hay que utilizar el siguiente comando.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. Cree un cliente de servicio Web XML.Create an XML Web service client.

    Si desea que Visual Studio genere la clase de proxy de servicio web automáticamente, simplemente cree el proyecto de cliente y, en la ventana Explorador de soluciones, haga clic con el botón secundario en el proyecto y, a continuación, seleccione Agregar > referencia deservicio.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, and then select Add > Service Reference. En el cuadro de diálogo Agregar referencia de servicio , seleccione Avanzadasy, a continuación, seleccione Agregar referencia web.In the Add Service Reference dialog box, select Advanced, and then select Add Web Reference. Seleccione el servicio web de la lista de servicios web disponibles (esto puede requerir proporcionar la dirección del punto de conexión del servicio web si el servicio web no está disponible en la solución actual o en el equipo actual).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). Si crea el proxy del servicio Web XML personalmente, tal y como se describe en el paso anterior, puede importarlo en el código de cliente y utilizar los métodos de servicio Web XML.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.

    El siguiente código de ejemplo importa la biblioteca de proxy, llama a GetCustomers para obtener una lista de clientes, agrega un nuevo cliente y, a continuación, devuelve un DataSet con las actualizaciones a UpdateCustomers.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.

    En el ejemplo se pasa el DataSet devuelto por DataSet.GetChanges a UpdateCustomers porque solo se deben pasar filas modificadas a UpdateCustomers.The example passes the DataSet returned by DataSet.GetChanges to UpdateCustomers because only modified rows need to be passed to UpdateCustomers. UpdateCustomers devuelve el conjunto de datosresuelto, que puede combinar en el conjunto de datos existente para incorporar los cambios resueltos y cualquier información de error de fila de la actualización.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. En el código siguiente se supone que ha utilizado Visual Studio para crear la referencia Web y que ha cambiado el nombre de la referencia Web a DsSample en el Agregar referencia web cuadro de diálogo.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();  
      }  
    }  
    

    Si decide crear la clase de proxy personalmente, debe seguir los pasos adicionales que se describen a continuación.If you decide to create the proxy class yourself, you must take the following extra steps. Para compilar el ejemplo, indique la biblioteca de proxy creada (sample.dll) y las bibliotecas de .NET relacionadas.To compile the sample, supply the proxy library that was created (sample.dll) and the related .NET libraries. Para compilar la versión de Visual Basic .NET del ejemplo, almacenada en el archivo client.vb, hay que utilizar el comando siguiente.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  
    

    Para compilar la versión de C# del ejemplo, almacenada en el archivo client.cs, hay que utilizar el comando siguiente.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  
    

Consulte tambiénSee also