C#, WPF – Webservice Part I

When I studied WCF Services and wrote some examples for training, I would like to make some basic review about Web Services therefore today I decide to write some simple examples working with Web Services. I know that there are a lot of examples with Web Services on internet but I want to write my own one so that I can use it later. Anyway reading and understanding my own example and explanation is faster than reading from the other one. Let’s start with step by step instructions. This example I took from book “Datenbank-Programmierung mit Visual C# 2005” with some modifications. At the end of this example I will have a running Web Service and a client get its data to show and edit.

1. Open Visual Studio and create new project type ASP.NET Web Service called “OrderService”.
2. Copy and move file Company.mdb as our database into App_Data.
3. In Web.config file, edit “connectionStrings” and add our connection to our database

<connectionStrings>
	<add name="DataConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Company.mdb;Persist Security Info = True" providerName="System.Data.Oledb"/>
</connectionStrings>

4. Remember set your project only running on x86 platform because OleDB does not support 64 bit OS. Add two web methods in our service to get data and let data be updated to database. The code looks little ugly but it works ^^.

private string strConnection = WebConfigurationManager.ConnectionStrings["DataConnectionString"].ToString();
[WebMethod]
public DataSet GetOrders(int CustomerNr, DateTime From, DateTime Till)
{
	DbProviderFactory provider = DbProviderFactories.GetFactory("System.Data.OleDb");
	DbConnection conn = provider.CreateConnection();
	conn.ConnectionString = strConnection;
	DbCommand cmd = provider.CreateCommand();
	cmd.Connection = conn;
	cmd.CommandText = "SELECT * FROM Orders WHERE CustomerNr = ? AND (EntranceDate BETWEEN ? AND ?)";
	DbParameter dbPar = cmd.CreateParameter();
	dbPar.ParameterName = "@CustomerNr";
	dbPar.DbType = DbType.Int32;
	dbPar.Value = CustomerNr;
	cmd.Parameters.Add(dbPar);

	dbPar = cmd.CreateParameter();
	dbPar.ParameterName = "@From";
	dbPar.DbType = DbType.Date;
	dbPar.Value = From;
	cmd.Parameters.Add(dbPar);

	dbPar = cmd.CreateParameter();
	dbPar.ParameterName = "@Till";
	dbPar.DbType = DbType.Date;
	dbPar.Value = Till;
	cmd.Parameters.Add(dbPar);

	DbDataAdapter da = provider.CreateDataAdapter();
	da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
	da.SelectCommand = cmd;
	DataSet dsOrder = new DataSet("OrderDS");
	conn.Open();
	da.Fill(dsOrder,"Orders");
	conn.Close();
	return dsOrder;
}

[WebMethod]
public void SetOrders(ref DataSet OrderDS)
{
	DbProviderFactory provider = DbProviderFactories.GetFactory("System.Data.OleDb");
	DbConnection conn = provider.CreateConnection();
	conn.ConnectionString = strConnection;
	DbCommand cmd = provider.CreateCommand();
	cmd.Connection = conn;
	cmd.CommandText = "SELECT * FROM Orders";
	DbDataAdapter da = provider.CreateDataAdapter();
	da.SelectCommand = cmd;
	da.ContinueUpdateOnError = true;
	DbCommandBuilder cb = provider.CreateCommandBuilder();
	cb.DataAdapter = da;
	conn.Open();
	da.Update(OrderDS.Tables["Orders"]);
	conn.Close();
}

5. Let’s compile and run our service. If everything goes, I’ll get the last result looks like following. Let’s test our GetOrders Web method.

6. Let’s add new project to our solution as our client. The new project is WPF Application “OrderClient”.
7. Use Microsoft Expression Blend 3 to design user interface as shown above. The user interface contain some labels, 3 buttons, 2 date picker and a data grid.
8. Right click on “OrderClient” project and “Add service reference”. On new opening dialog, click on Discover and choose Service in Solution and choose “OrdersService”.

9. Add handler to button click to load data and save changed data to our database.

private void btnLoadOrders_Click(object sender, System.Windows.RoutedEventArgs e)
{
	// TODO: Add event handler implementation here.
	try
	{
		int nCustNr = Convert.ToInt32(txtCustomer.Text);
		if (m_ServiceType == CallServiceTypes.ASYNCHRON)
		{
			OrdersService.GetOrdersCompleted += new EventHandler<OrderClient.OrdersServiceReference.GetOrdersCompletedEventArgs>(OrdersService_GetOrdersCompleted);
			OrdersService.GetOrdersAsync(nCustNr, dpFrom.DisplayDate, dpTill.DisplayDate);
		}
		else
		{
			m_dsOrders = OrdersService.GetOrders(nCustNr, dpFrom.DisplayDate, dpTill.DisplayDate);
			dgData.ItemsSource = m_dsOrders.Tables["Orders"].DefaultView;
		}
		//dgData.DataContext = dsTemp.Tables["Orders"];

	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

10. As you can see in the code above I use asynchronous and synchronous to get data. When using asynchronous method, for any reasons if the web service is not available, the method will not last until Timeout error raises but it will response immediately so that we do not wait. To use asynchronous method, we must configure our referenced service to auto create asynchronous operations.

The complete source code of example you can download here “Order Service

Leave a Reply

Your email address will not be published. Required fields are marked *