Využívání datové sady z webové služby XML
Byl DataSet navržen s odpojeným designem, který částečně usnadňuje pohodlný přenos dat přes internet. Datová sada je serializovatelná v tom, že je možné ji zadat jako vstup nebo výstup z webových služeb XML bez jakéhokoli dalšího kódování potřebného k streamování obsahu datové sady z webové služby XML do klienta a zpět. DataSet je implicitně převeden na datový proud XML pomocí formátu DiffGram, odeslán přes síť a poté rekonstruován z datového proudu XML jako DataSet na přijímající straně. To vám poskytne jednoduchou a flexibilní metodu pro přenos a vracení relačních dat pomocí webových služeb XML. Další informace o formátu DiffGram naleznete v tématu DiffGrams.
Následující příklad ukazuje, jak vytvořit webovou službu XML a klienta, který používá Sadu dat k přenosu relačních dat (včetně upravených dat) a vyřešit všechny aktualizace zpět do původního zdroje dat.
Poznámka:
Přenosy DataSet
nebo DataTable
instance v rámci volání webové služby XML nejsou bezpečné, pokud vstup není důvěryhodný. Další informace naleznete v tématu DataSet a DataTable security guidance.
Při vytváření webové služby XML také doporučujeme vždy zvážit bezpečnostní důsledky. Informace o zabezpečení webové služby XML naleznete v tématu Zabezpečení webových služeb XML vytvořených pomocí ASP.NET.
Vytvoření webové služby XML
Vytvořte webovou službu XML.
V tomto příkladu se vytvoří webová služba XML, která vrací data, v tomto případě seznam zákazníků z databáze Northwind a přijímá datovou sadu s aktualizacemi dat, které webová služba XML překládá zpět do původního zdroje dat.
Webová služba XML zveřejňuje dvě metody: GetCustomers, aby vrátil seznam zákazníků a UpdateCustomers, aby přeložil aktualizace zpět do zdroje dat. Webová služba XML je uložena v souboru na webovém serveru s názvem DataSetSample.asmx. Následující kód popisuje obsah 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; } }
V typickém scénáři by metoda UpdateCustomers byla zapsána tak, aby zachytila porušení optimistické souběžnosti. Pro zjednodušení tento příklad neobsahuje. Další informace o optimistické souběžnosti najdete v tématu Optimistická souběžnost.
Vytvořte proxy webové služby XML.
Klienti webové služby XML vyžadují proxy protokolu SOAP, aby mohli využívat vystavené metody. Visual Studio může tento proxy server vygenerovat za vás. Nastavením webového odkazu na existující webovou službu v sadě Visual Studio dojde k transparentnímu chování popsanému v tomto kroku. Pokud chcete třídu proxy vytvořit sami, pokračujte v této diskuzi. Ve většině případů však stačí, když pomocí sady Visual Studio vytvoříte třídu proxy pro klientskou aplikaci.
Proxy server lze vytvořit pomocí nástroje Pro popis webových služeb. Pokud je například webová služba XML vystavená na adrese URL
http://myserver/data/DataSetSample.asmx
, zadejte příkaz, jako je například následující, který vytvoří proxy .NET jazyka Visual Basic s oborem názvů WebData.DSSample a uloží ho do souboru sample.vb.wsdl /l:VB -out:sample.vb http://myserver/data/DataSetSample.asmx /n:WebData.DSSample
Pokud chcete v souboru sample.cs vytvořit proxy jazyka C#, zadejte následující příkaz.
wsdl -l:CS -out:sample.cs http://myserver/data/DataSetSample.asmx -n:WebData.DSSample
Proxy server je pak možné zkompilovat jako knihovnu a importovat do klienta webové služby XML. Pokud chcete zkompilovat kód proxy .NET jazyka Visual Basic uložený v sample.vb jako sample.dll, spusťte následující příkaz.
vbc -t:library -out:sample.dll sample.vb -r:System.dll -r:System.Web.Services.dll -r:System.Data.dll -r:System.Xml.dll
Pokud chcete zkompilovat kód proxy c# uložený v sample.cs jako sample.dll, spusťte následující příkaz.
csc -t:library -out:sample.dll sample.cs -r:System.dll -r:System.Web.Services.dll -r:System.Data.dll -r:System.Xml.dll
Vytvořte klienta webové služby XML.
Pokud chcete, aby sada Visual Studio vygenerovala třídu proxy webových služeb za vás, jednoduše vytvořte projekt klienta a v okně Průzkumník řešení klikněte pravým tlačítkem myši na projekt a pak vyberte Přidat>odkaz na službu. V dialogovém okně Přidat odkaz služby vyberte Upřesnit a pak vyberte Přidat odkaz na web. Ze seznamu dostupných webových služeb vyberte webovou službu (to může vyžadovat zadání adresy koncového bodu webové služby, pokud webová služba není dostupná v aktuálním řešení nebo v aktuálním počítači). Pokud proxy webové služby XML vytvoříte sami (jak je popsáno v předchozím kroku), můžete ho importovat do kódu klienta a využívat metody webové služby XML.
Následující ukázkový kód naimportuje knihovnu proxy, zavolá GetCustomers , aby získal seznam zákazníků, přidá nového zákazníka a pak vrátí datovou sadu s aktualizacemi UpdateCustomers.
Příklad předá datovou sadu vrácenou DataSet.GetChanges updateCustomers, protože pouze upravené řádky je potřeba předat UpdateCustomers. UpdateCustomers vrátí vyřešenou datovou sadu, kterou pak můžete sloučit do existující datové sady , aby zahrnovaly vyřešené změny a všechny informace o chybě řádku z aktualizace. Následující kód předpokládá, že jste k vytvoření webového odkazu použili Visual Studio a že jste přejmenovali webový odkaz na DsSample v dialogovém okně Přidat odkaz na web.
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(); } }
Pokud se rozhodnete vytvořit proxy třídu sami, musíte provést následující kroky navíc. Pokud chcete zkompilovat ukázku, zadejte knihovnu proxy, která byla vytvořena (sample.dll) a související knihovny .NET. Pokud chcete zkompilovat verzi .NET jazyka Visual Basic ukázky uloženou v souboru client.vb, spusťte následující příkaz.
vbc client.vb -r:sample.dll -r:System.dll -r:System.Data.dll -r:System.Xml.dll -r:System.Web.Services.dll
Pokud chcete zkompilovat verzi ukázky jazyka C#, která je uložená v souboru client.cs, spusťte následující příkaz.
csc client.cs -r:sample.dll -r:System.dll -r:System.Data.dll -r:System.Xml.dll -r:System.Web.Services.dll