Dela via


Använda en DataSet från en XML-webbtjänst

Var DataSet konstruerad med en frånkopplad design, delvis för att underlätta bekväm transport av data via Internet. DataSet är "serialiserbar" eftersom den kan anges som indata till eller utdata från XML-webbtjänster utan någon ytterligare kodning som krävs för att strömma innehållet i DataSet från en XML-webbtjänst till en klient och tillbaka. DataSet konverteras implicit till en XML-dataström med DiffGram-formatet, skickas via nätverket och rekonstrueras sedan från XML-dataströmmen som en DataSet i den mottagande änden. Detta ger dig en enkel och flexibel metod för att överföra och returnera relationsdata med hjälp av XML-webbtjänster. Mer information om DiffGram-formatet finns i DiffGrams.

I följande exempel visas hur du skapar en XML-webbtjänst och -klient som använder DataSet för att transportera relationsdata (inklusive ändrade data) och lösa eventuella uppdateringar tillbaka till den ursprungliga datakällan.

Kommentar

Överföring DataSet eller DataTable instanser som en del av XML-webbtjänstanrop är inte säkert om indata inte är betrodda. Mer information finns i Säkerhetsvägledning för DataSet och DataTable. Vi rekommenderar också att du alltid överväger säkerhetskonsekvenser när du skapar en XML-webbtjänst. Information om hur du skyddar en XML-webbtjänst finns i Skydda XML-webbtjänster som skapats med hjälp av ASP.NET.

Skapa en XML-webbtjänst

  1. Skapa XML-webbtjänsten.

    I exemplet skapas en XML-webbtjänst som returnerar data, i det här fallet en lista över kunder från Northwind-databasen och tar emot en DataSet med uppdateringar av data, som XML-webbtjänsten löser tillbaka till den ursprungliga datakällan.

    XML-webbtjänsten exponerar två metoder: GetCustomers, för att returnera listan över kunder och UpdateCustomers, för att lösa uppdateringar tillbaka till datakällan. XML-webbtjänsten lagras i en fil på webbservern med namnet DataSetSample.asmx. Följande kod beskriver innehållet i 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;  
      }  
    }  
    

    I ett typiskt scenario skulle metoden UpdateCustomers skrivas för att fånga optimistiska samtidighetsöverträdelser. För enkelhetens skull innehåller exemplet inte detta. Mer information om optimistisk samtidighet finns i Optimistisk samtidighet.

  2. Skapa en XML-webbtjänstproxy.

    Klienter för XML-webbtjänsten kräver en SOAP-proxy för att kunna använda de exponerade metoderna. Du kan låta Visual Studio generera den här proxyn åt dig. Genom att ange en webbreferens till en befintlig webbtjänst inifrån Visual Studio sker allt beteende som beskrivs i det här steget transparent. Om du vill skapa proxyklassen själv fortsätter du med den här diskussionen. I de flesta fall räcker det dock att använda Visual Studio för att skapa proxyklassen för klientprogrammet.

    En proxy kan skapas med hjälp av språkverktyget för beskrivning av webbtjänster. Om XML-webbtjänsten till exempel visas på URL:en http://myserver/data/DataSetSample.asmxutfärdar du ett kommando som följande för att skapa en Visual Basic .NET-proxy med namnområdet WebData.DSSample och lagra den i filen sample.vb.

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

    Om du vill skapa en C#-proxy i filen sample.cs utfärdar du följande kommando.

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

    Proxyn kan sedan kompileras som ett bibliotek och importeras till XML-webbtjänstklienten. Om du vill kompilera Visual Basic .NET-proxykoden som lagras i sample.vb som sample.dll utfärdar du följande kommando.

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

    Utför följande kommando för att kompilera C#-proxykoden som lagras i sample.cs som sample.dll.

    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. Skapa en XML-webbtjänstklient.

    Om du vill att Visual Studio ska generera webbtjänstproxyklassen åt dig skapar du bara klientprojektet och högerklickar på projektet i Solution Explorer-fönstret och väljer sedan Lägg till>tjänstreferens. I dialogrutan Lägg till tjänstreferens väljer du Avancerat och sedan Lägg till webbreferens. Välj webbtjänsten i listan över tillgängliga webbtjänster (detta kan kräva att du anger adressen till webbtjänstslutpunkten om webbtjänsten inte är tillgänglig i den aktuella lösningen eller på den aktuella datorn). Om du skapar XML-webbtjänstproxyn själv (enligt beskrivningen i föregående steg) kan du importera den till klientkoden och använda XML-webbtjänstmetoderna.

    Följande exempelkod importerar proxybiblioteket, anropar GetCustomers för att hämta en lista över kunder, lägger till en ny kund och returnerar sedan en DataSet med uppdateringarna till UpdateCustomers.

    Exemplet skickar DataSet som returneras av DataSet.GetChanges till UpdateCustomers eftersom endast ändrade rader behöver skickas till UpdateCustomers. UpdateCustomers returnerar den lösta DataSeten, som du sedan kan sammanfoga till den befintliga DataSet för att införliva de lösta ändringarna och eventuell radfelinformation från uppdateringen. Följande kod förutsätter att du har använt Visual Studio för att skapa webbreferensen och att du har bytt namn på webbreferensen till DsSample i dialogrutan Lägg till webbreferens .

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

    Om du väljer att skapa proxyklassen själv måste du utföra följande extra steg. Om du vill kompilera exemplet anger du proxybiblioteket som skapades (sample.dll) och de relaterade .NET-biblioteken. Om du vill kompilera Visual Basic .NET-versionen av exemplet, som lagras i filen client.vb, utfärdar du följande kommando.

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

    Om du vill kompilera C#-versionen av exemplet, som lagras i filen client.cs, utfärdar du följande kommando.

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

Se även