Silverlight and Database without LINQ and EDM


Hi All,
I am writing this Blog because of one reason. Many people have a question about accessing the data in Silverlight applications without LINQ, LINQ-To-SQL Or EDM (Entity Data Model).

The answer for this question is “Yes, You can!!”. So, to achieve this, there can be multiple ways. I have achieved this by my way.

So, let’s start looking at the Steps-

1) Create a Silverlight project using VS 2008/ VS 2010 and name it as “SLWithoutLINQ”.

2) Design the Page.xaml as per your specifications. I have taken only a single button which will give a call to WCF Service method and that method will return a collection of class called “Students”.


Page.xaml-

<UserControl x:Class="SL3WithoutLINQ.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400"> 


      <Grid x:Name="LayoutRoot" Background="Black"> 
           <Button x:Name="btnShowResult" Content="Show Result" Click="btnShowResult_Click" Height="100" Width="200"/>
      </Grid>
</UserControl>

3) My database description is as below-

Database Name – Sample.

Table Name – Test.

Table structure -

Field Name Data Type
InstID Int
StudID Int
Subject Varchar(50)
Result Varchar(50)
FailedReason Varchar(50)


4) Now, let’s add a class in our web site or web application with name “Students” as shown below-

public class Students
{
      public int InstanceID { get; set; }
      public int StudentID { get; set; }
      public string Subject { get; set; }
      public string Result { get; set; }
      public string FailedReason { get; set; }
}

5) Now, let’s add a simple WCF Service by the name “FetchResults” and write a code as below(Once you add a WCF Service, you will get an Interface and a class which implements that Interface)-
Interface-

[ServiceContract]
public interface IFetchResults
{
[OperationContract]
List<Students> FetchStudentResult();
}
 
Class-

using
System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data;
using System.Data.SqlClient;

// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "FetchResults" in code, svc and config file together.
public class FetchResults : IFetchResults
{

      public List<Students> FetchStudentResult()
      {
          SqlConnection CN = new SqlConnection(@"Server=.\SQLExpress;Database=Sample;Integrated Security=true");
          SqlCommand CMD = new SqlCommand("Select * from Test",CN);
          CN.Open();

          SqlDataReader DR = CMD.ExecuteReader();
          List<Students> result=new List<Students>();
          while (DR.Read())
          {
               result.Add(new Students() {StudentID=int.Parse(DR[1].ToString
()),InstanceID=int.Parse(DR[0].ToString()),Subject=DR[2].ToString(),Result=DR[3].ToString
(),FailedReason=DR[4].ToString() }); 
          }
return result; 
      }
}
6) Now once you finish your service code, Now the most important thing is change the Web.Config file.
So, When you add a WCF Service, it by default gives binding as wsHttpBinding. Silverlight supports only basicHttpBinding.
So, change it as below-

<
endpoint address="" binding="basicHttpBinding" contract="IFetchResults">
       <identity>
             <dns value="localhost"/>
       </identity>
</endpoint>
7) The method “FetchStudentResult” returns a collection of “Students” class. Now let’s move to out next step.

8) Now add a WCF Service reference to your Silverlight project. and create a proxy of a class “FetchResultsClient” as shown below-

List<StudentProxy.Students> studCollection;

private void btnShowResult_Click(object sender, RoutedEventArgs e)
{
      StudentProxy.FetchResultsClient proxy = new
SL3WithoutLINQ.StudentProxy.FetchResultsClient(); 

      proxy.FetchStudentResultCompleted += new 
EventHandler<SL3WithoutLINQ.StudentProxy.FetchStudentResultCompletedEventArgs>
(proxy_FetchStudentResultCompleted); 


      proxy.FetchStudentResultAsync();

}

void proxy_FetchStudentResultCompleted(object sender,
SL3WithoutLINQ.StudentProxy.FetchStudentResultCompletedEventArgs e)
{
      studCollection = e.Result.ToList();
}
9) Now put a break point on “proxy_FetchStudentResultCompleted” method. and run your
application. Click the button “Show Result”. and when the break point is invoked, you will
see the no. of instances in the studCollection as shown below-

DebugView.jpg


In the above result, I have six rows return from the table called “Test”. Now you can use this collection as a data context for any control !!

10) So, That’s all !! Enjoy.