Consumir DataSet a partir de un servicio Web XML
La arquitectura del DataSet tiene un diseño desconectado, en parte para facilitar el transporte de datos a través de Internet. DataSet y DataTable son "serializables" en el sentido de que pueden especificarse como entrada o como salida de servicios Web XML sin necesidad de programación adicional para transmitir en secuencia el contenido del DataSet desde un servicio Web XML a un cliente y viceversa. El DataSet se convierte implícitamente en una secuencia XML mediante el formato DiffGram, se envía a través de la red y se reconstruye a partir de la secuencia XML como un DataSet del extremo receptor. Esto proporciona un método muy sencillo y flexible para transmitir y devolver datos relacionales mediante servicios Web XML. Para obtener más información acerca del formato DiffGram, vea DiffGrams.
En el siguiente ejemplo se muestran los pasos para crear un servicio Web XML, así como un cliente de dicho servicio, que utiliza el DataSet para transportar datos relacionales, incluyendo modificaciones a dichos datos, y resolver cualquier actualización en el origen de datos inicial.
Nota Al crear un servicio Web XML siempre debe tener en cuenta las implicaciones de seguridad. Para obtener información sobre cómo proteger un servicio Web XML, vea Proteger servicios Web XML creados mediante ASP.NET.
Para crear un servicio Web XML que devuelve y consume un DataSet
Cree el servicio Web XML.
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 relacionadas con los datos que el servicio Web XML resuelve y devuelve al origen de datos inicial.
El servicio Web XML expone dos métodos: GetCustomers, para devolver la lista de clientes, y UpdateCustomers, para resolver las actualizaciones en el origen de datos. El servicio Web XML se almacena en un archivo del servidor Web denominado DataSetSample.asmx. En el siguiente código se describe el contenido de 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; } }
En un escenario típico se escribiría el método UpdateCustomers para detectar infracciones de la concurrencia optimista. Para simplificar, el ejemplo no lo incluye. Para obtener más información acerca de la concurrencia optimista, vea Concurrencia optimista.
Cree un proxy de servicio Web XML.
Los clientes del servicio Web XML necesitarán un proxy SOAP para utilizar los métodos expuestos. Es posible crear un proxy con la herramienta Lenguaje de descripción de servicios Web (Wsdl.exe). Por ejemplo, si el servicio Web XML se expone en la dirección URL http://myserver/data/DataSetSample.asmx, hay que utilizar 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.
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.
wsdl /: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. Para compilar el código de proxy de Visual Basic .NET almacenado en sample.vb como sample.dll, hay que utilizar el siguiente comando.
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.
csc /t:library /out:sample.dll sample.cs /r:System.dll /r:System.Web.Services.dll /r:System.Data.dll /r:System.Xml.dll
Cree un cliente de servicio Web XML.
Una vez creado el proxy del servicio Web XML, es posible importarlo en el código del cliente y utilizar los métodos del servicio Web XML. En el siguiente ejemplo de código se importa la biblioteca de proxy, se llama a GetCustomers para obtener una lista de clientes, se agrega un nuevo cliente y se devuelve un DataSet con las actualizaciones a UpdateCustomers. Hay que tener en cuenta que el ejemplo pasa a UpdateCustomers el DataSet devuelto por DataSet.GetChanges, ya que sólo es necesario pasar a UpdateCustomers las filas modificadas. UpdateCustomers devuelve el DataSet resuelto, que puede combinar (con Merge) en el DataSet existente para incorporar los cambios resueltos y cualquier información de error de fila de la actualización.
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(); } }
Para compilar el ejemplo habrá que indicar la biblioteca de proxy creada (sample.dll) y las bibliotecas de .NET relacionadas. Para compilar la versión de Visual Basic .NET del ejemplo, almacenada en el archivo client.vb, hay que utilizar el comando siguiente.
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.
csc client.cs /r:sample.dll /r:System.dll /r:System.Data.dll /r:System.Xml.dll /r:System.Web.Services.dll
Vea también
Ejemplo de escenarios de ADO.NET | Acceso a datos con ADO.NET | Utilizar proveedores de datos de .NET Framework para obtener acceso a datos | Crear y utilizar DataSets | Crear y utilizar DataTables | Llenar un DataSet desde un DataAdapter | Actualizar la base de datos con un DataAdapter y el DataSet | Utilizar parámetros con DataAdapter