[ Team LiB ]
Recipe 2.5 Using aWebServiceasa Data Source
Problem
You want to use a webserviceas the datasource for a client application.
Solution
Create awebservice that returns a DataSet to a client, and then invoke the webservice
from the client to retrieve the DataSet.
The XML webservice code contains one method:
LoadOrders( )
Creates a DataSet containing all Orders and Order Details data from Northwind. A
DataRelation is created relating the tables. The DataSet is returned by the method.
The client-side code instantiates the webservice class and calls the LoadOrders( ) method
to create a DataSet containing the Orders and Order Details data from Northwind. The
default view of the Orders table is bound to adata grid on the form.
The C# code for the XML webservice is shown in Example 2-4
.
Example 2-4. File: NorthwindServiceCS.asmx.cs
// Namespaces, variables, and constants
using System;
using System.ComponentModel;
using System.Web.Services;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
public const String ORDERS_TABLE = "Orders";
public const String ORDERDETAILS_TABLE = "OrderDetails";
public const String ORDERID_FIELD = "OrderID";
public const String ORDERS_ORDERDETAILS_RELATION =
"Order_OrderDetails_Relation";
// . . .
[WebMethod]
public DataSet LoadOrders( )
{
DataSet ds = new DataSet( );
SqlDataAdapter da;
// Fill the Order table and add it to the DataSet.
da = new SqlDataAdapter("SELECT * FROM Orders",
ConfigurationSettings.AppSettings["DataConnectString"]);
DataTable orderTable = new DataTable(ORDERS_TABLE);
da.FillSchema(orderTable, SchemaType.Source);
da.Fill(orderTable);
ds.Tables.Add(orderTable);
// Fill the OrderDetails table and add it to the DataSet.
da = new SqlDataAdapter("SELECT * FROM [Order Details]",
ConfigurationSettings.AppSettings["DataConnectString"]);
DataTable orderDetailTable = new DataTable(ORDERDETAILS_TABLE);
da.FillSchema(orderDetailTable, SchemaType.Source);
da.Fill(orderDetailTable);
ds.Tables.Add(orderDetailTable);
// Create a relation between the tables.
ds.Relations.Add(ORDERS_ORDERDETAILS_RELATION,
ds.Tables[ORDERS_TABLE].Columns[ORDERID_FIELD],
ds.Tables[ORDERDETAILS_TABLE].Columns[ORDERID_FIELD],
true);
return ds;
}
The C# web services client-side code is shown in Example 2-5
.
Example 2-5. File: WebServiceDataSourceForm.cs
// Namespaces, variables, and constants
using System;
using System.Windows.Forms;
using System.Data;
// Table name constants
private const String ORDERS_TABLE= "Orders";
// . . .
// Create the WebService object.
N
orthwindSe
r
viceCS nws = new NorthwindServiceCS( );
// Load the DataSet containing orders and order details.
DataSet ds = nws.LoadOrders( );
// Bind the default view of the orders table to the grid.
dataGrid.DataSource = ds.Tables[ORDERS_TABLE].DefaultView;
Discussion
An XML webservice is software that is accessible using Internet standards such as XML
and HTTP. Because it is accessible through open-standard interfaces, web services make
it easy to allow heterogeneous systems to work together.
.NET makes it very easy to build XML web services. In .NET, web services are
implemented as .ASMX files beginning with a @WebService directive. For example, the
solution code contains the following directive:
<%@ WebService Language="c#" Codebehind="NorthwindServiceCS.asmx.cs"
Class="NorthwindServiceCS" %>
Methods in the webservice class that are exposed over the Web are tagged with the
WebMethod attribute; untagged methods can be used only internally by the web service.
To deploy the web service, copy it to a virtual directory that has script execute
permissions on an IIS web server that has ASP.NET support.
To use the webservice class, use wsdl.exe to create the client-side proxy class. For the
solution, the command is:
wsdl.exe http://localhost/NorthwindWebServiceCS/NorthwindServiceCS.asmx
Then, as with a local class, the client is able to instantiate the webservice class using the
new operator.
For more information about creating and consuming XML web services, see the MSDN
Library.
The solution shows that there is very little difference between implementing the
LoadOrders( )methods to retrieve a DataSet containing the Orders and Order Details data
from Northwind asa local class or as aweb services class.
[ Team LiB ]
.
[ Team LiB ]
Recipe 2.5 Using a Web Service as a Data Source
Problem
You want to use a web service as the data source for a client application )methods to retrieve a DataSet containing the Orders and Order Details data
from Northwind as a local class or as a web services class.
[ Team LiB ]