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-
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.