WCF Data Contract and Data Members
Implementing the WCF data contract and data members in a student service scenario, in which a student can be entered in to the database and data can be retrieved from the database also.
· Create a database to store and retrieve students from the database
To create a table of Students write this code
create Table Student
{
Id int,
Name nvarchar (50),
Department nvarchar (50),
DateOfBirth datetime
}
Insert Into Student values(1,’Rehan’,’Computer ’,’10/04/1994’)
Insert Into Student values(1,’Ahmad’,’Economics ’,’01/09/1989’)
Insert Into Student values(1,’Haleem’,’Politics ’,’22/11/1990’)
Create procedure spGetStudent
@Id int
as
Begin
Select Id, Name, Department, DateOfBirth
From Student
Where Id = @Id
End
Create procedure spSaveStudent
@Id int,
@Name nvarchar(50),
@Department nvarchar(50),
@DateOfBirth DateTime
as
Begin
Insert Into Student
Values (@Id, @Name, @Department , @DateOfBirth)
End
Create a class library projects as StudentService
Rename the class1.cs file to “Student.cs”
Enter this code in student.cs file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace StudentService
{
[KnownType(typeof(4YearProgram))]
[KnownType(typeof(DiplomyProgram))]
public class Student
{
private int _id;
private string _name;
private string _department;
private DateTime _dateOfBirth;
[DataMember(Order = 1)]
public int Id
{
get { return _id; }
set { _id = value; }
}
[DataMember(Order = 2)]
public string Name
{
get { return _name; }
set { _name = value; }
}
[DataMember(Order = 3)]
public string Department
{
get { return _department; }
set { _department = value; }
}
[DataMember(Order = 4)]
public DateTime DateOfBirth
{
get { return _dateOfBirth; }
set { _dateOfBirth = value; }
}
[DataMember(Order = 5)]
public EmployeeType Type { get; set; }
}
public enum EmployeeType
{
4YearProgram = 1,
DiplomyProgram = 2
}
public class 4YearProgram : Student
{
public int SemesterCredits { get; set; }
}
public class DiplomyProgram : Student
{
public int AnnualCredits { get; set; }
public int HoursWorked { get; set; }
}
}
Add Wcf Service in the StudentService Class as StudentService
Enter this code in IStudentService
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace StudentService
{
[ServiceContract]
public interface IStudentService
{
[OperationContract]
Student GetStudent(Int32 Id);
[OperationContract]
void SaveStudent(Student student);
}
}
Enter this coede in StudentService .cs file
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;
using System.Configuration;
namespace StudentService
{
public class StudentService : IStudentService
{
public Student GetStudent(int Id)
{
Student student = null;
string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("spGetStudent", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parameterId = new SqlParameter();
parameterId.ParameterName = "@Id";
parameterId.Value = Id;
cmd.Parameters.Add(parameterId);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
if ((StudentType)reader["StudentType"] == StudentType.4YearProgram)
{
student = new 4Yearprogram
{
Id = Convert.ToInt32(reader["Id"]),
Name = reader["Name"].ToString(),
Department = reader["Department"].ToString(),
DateOfBirth = Convert.ToDateTime(reader["DateOfBirth"]),
Type = StudentType.4YearProgram,
SemesterCredits = Convert.ToInt32(reader["SemesterCredits"])
};
}
else
{
student = new DiplomyProgram
{
Id = Convert.ToInt32(reader["Id"]),
Name = reader["Name"].ToString(),
Department = reader["Department"].ToString(),
DateOfBirth = Convert.ToDateTime(reader["DateOfBirth"]),
Type = StudentType.DiplomyProgram,
AnnualCredits = Convert.ToInt32(reader[" AnnualCredits"]),
HoursWorked = Convert.ToInt32(reader["HoursWorked"]),
};
}
}
}
return Student;
}
public void SaveStudent(Student Student)
{
string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("spSaveStudent", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parameterId = new SqlParameter
{
ParameterName = "@Id",
Value = Student.Id
};
cmd.Parameters.Add(parameterId);
SqlParameter parameterName = new SqlParameter
{
ParameterName = "@Name",
Value = student.Name
};
cmd.Parameters.Add(parameterName);
SqlParameter parameterDepartment = new SqlParameter
{
ParameterName = "@Department",
Value = Student.Department
};
cmd.Parameters.Add(parameterDepartment);
SqlParameter parameterDateOfBirth = new SqlParameter
{
ParameterName = "@DateOfBirth",
Value = student.DateOfBirth
};
cmd.Parameters.Add(parameterDateOfBirth);
SqlParameter parameterStudentType = new SqlParameter
{
ParameterName = "@StudentType",
Value = student.Type
};
cmd.Parameters.Add(parameterStudentType);
if (student.GetType() == typeof(4YearProgram))
{
SqlParameter parameterSemesterCredits = new SqlParameter
{
ParameterName = "@SemesterCredits",
Value = ((4YearProgram)sudent).SemesterCredits
};
cmd.Parameters.Add(semestercredits);
}
else
{
SqlParameter parameterannualcredits = new SqlParameter
{
ParameterName = "@annualcredits",
Value = ((diplomyProgram).annualcredits,
};
cmd.Parameters.Add(parameterHourlyPay);
SqlParameter parameterHoursWorked = new SqlParameter
{
ParameterName = "@HoursWorked",
Value = ((PartTimeEmployee)employee).HoursWorked
};
cmd.Parameters.Add(parameterHoursWorked);
}
con.Open();
cmd.ExecuteNonQuery();
}
}
}
}
Now created a new console application to host the service as EmployHostService
Now add a application configuration file to this project and add the following code into it
<?xml version="1.0" encoding="utf-8" ?>
configuration
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup
<connectionStrings
<add name="DBCS"
connectionString="data source=com1;Integrated Security=SSPI;database=Sample"
providerName="System.Data.SqlClient" />
</connectionStrings
<system.serviceModel
<services
<service behaviorConfiguration="mexBehaviour" name="StudentService.StudentService"
<endpoint address="StudentService" binding="basicHttpBinding"
contract="StudentService.IStudentService" />
<host
<baseAddresses
<add baseAddress="http://localhost:8080/" />
</baseAddresses
</host
</service
</services
<behaviors
<serviceBehaviors
<behavior name="mexBehaviour"
<serviceMetadata httpGetEnabled="true"/>
</behavior
</serviceBehaviors
</behaviors
</system.serviceModel
</configuration
Add system.servicemodel to the references of StudentServiceHost
Add this code to the program.cs of StudentServiceHost project
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace EmployeeServiceHost
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(StudentService.StudentService)))
{
host.Open();
Console.WriteLine("Host started @ " + DateTime.Now.ToString());
Console.ReadLine();
}
}
}
}
Now create a new empty asp.net application and name it as web client.
Add a service reference to the base address of the Student service host in the web application.
http://localhost:8080/"
Paste this html into the web form
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebClient.WebForm1" %>
<!DOCTYPE html
html xmlns="http://www.w3.org/1999/xhtml">
head runat="server">
title</title
</head
body
form id="form1" runat="server">
div
table style="font-family: Arial; border: 1px solid black;">
tr
td
bID</b
</td
td
asp:TextBox ID="txtID" runat="server">
</asp:TextBox
</td
</tr
tr
td
bName</b
</td
td
asp:TextBox ID="txtName" runat="server">
</asp:TextBox
</td
</tr
tr
td
bGender</b
</td
td
asp:TextBox ID="txtDepartment" runat="server">
</asp:TextBox
</td
</tr
tr
td
bDate Of Birth</b
</td
td
asp:TextBox ID="txtDateOfBirth" runat="server">
</asp:TextBox
</td
</tr
tr
td
bEmployee Type</b
</td
td
asp:DropDownList ID="ddlStudentType" runat="server"
OnSelectedIndexChanged="ddlStudentType_SelectedIndexChanged"
AutoPostBack="True">
asp:ListItem Text="Select Student Type" Value="-1">
</asp:ListItem
asp:ListItem Text="4 years program" Value="1">
</asp:ListItem
asp:ListItem Text="Diploma" Value="2">
</asp:ListItem
</asp:DropDownList
</td
</tr
tr id="trsemesterCredits" runat="server" visible="false">
td
bSemesterCredits</b
</td
td
asp:TextBox ID="txtSemesterCredits" runat="server">
</asp:TextBox
</td
</tr
tr id="trAnnualCredits" runat="server" visible="false">
td
bAnnualCredits</b
</td
td
asp:TextBox ID="txtAnnualCredits" runat="server">
</asp:TextBox
</td
</tr
tr id="trHoursWorked" runat="server" visible="false">
td
bHours worked</b
</td
td
asp:TextBox ID="txtHoursWorked" runat="server">
</asp:TextBox
</td
</tr
tr
td
asp:Button ID="btnGetStudent" runat="server"
Text="Get Employee" OnClick="btnGetStudent_Click" />
</td
td
asp:Button ID="btnSave" runat="server"
Text="Save Student" OnClick="btnSave_Click" />
</td
</tr
tr
td colspan="2">
asp:Label ID="lblMessage" runat="server"
ForeColor="Green" Font-Bold="true">
</asp:Label
</td
</tr
</table
</div
</form
</body
</html
Add this code into the web.form1.aspx file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebClient
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnGetStudent_Click(object sender, EventArgs e)
{
StudentService.StudentServiceClient client =
new StudentService.StudentServiceClient();
StudentService.Student student =
client.GetStudent(Convert.ToInt32(txtID.Text));
if (Student.Type == StudentService.StudentType.4yearProgram)
{
txtSemesterCredits.Text =
((StudentService.4YearProgram)employee).SemesterCredits.ToString();
trSemesterCredits.Visible = true;
trAnnualCredits.Visible = false;
trHoursWorked.Visible = false;
}
else
{
txtAnnualCredits.Text =
((StudentService.diplomaProgram)employee).AnnualCredits.ToString();
txtHoursWorked.Text =
((StudentService.diplomaProgram)employee).HoursWorked.ToString();
trAnnualCredits.Visible = false;
trHourlPay.Visible = true;
trHoursWorked.Visible = true;
}
ddlStudentType.SelectedValue = ((int)employee.Type).ToString();
txtName.Text = employee.Name;
txtGender.Text = employee.Gender;
txtDateOfBirth.Text = employee.DateOfBirth.ToShortDateString();
lblMessage.Text = "Employee retrieved";
}
protected void btnSave_Click(object sender, EventArgs e)
{
StudentService.StudentServiceClient client = new
StudentService.StudentServiceClient();
StudentService.Employee employee = null;
if (((StudentService.StudentType)Convert.ToInt32(ddlStudentType.SelectedValue))
== StudentService.StudentType.4YearProgram)
{
employee = new StudentService.4YearProgram
{
Id = Convert.ToInt32(txtID.Text),
Name = txtName.Text,
Gender = txtGender.Text,
DateOfBirth = Convert.ToDateTime(txtDateOfBirth.Text),
Type = StudentService.StudentType.4YearProgram,
SemesterCredits = Convert.ToInt32(txtSemesterCredits.Text),
};
client.SaveEmployee(employee);
lblMessage.Text = "Employee saved";
}
else if (((StudentService.StudentType)Convert.ToInt32(ddlStudentType.SelectedValue))
== StudentService.StudentType.diplomaProgram)
{
employee = new StudentService.diplomaProgram
{
Id = Convert.ToInt32(txtID.Text),
Name = txtName.Text,
Department = txtDepartment.Text,
DateOfBirth = Convert.ToDateTime(txtDateOfBirth.Text),
Type = StudentService.StudentType.diplomaProgram,
HourlyPay = Convert.ToInt32(txtAnnualCredits.Text),
HoursWorked = Convert.ToInt32(txtHoursWorked.Text),
};
client.SaveStudent(Student);
lblMessage.Text = "student saved";
}
else
{
lblMessage.Text = "Please select Student Type";
}
}
protected void ddlStudentType_SelectedIndexChanged(object sender, EventArgs e)
{
if (ddlStudentType.SelectedValue == "-1")
{
trSemesterCredits.Visible = false;
trAnnualCredits.Visible = false;
trHoursWorked.Visible = false;
}
else if (ddlStudentType.SelectedValue == "1")
{
trSemesterCredits.Visible = true;
trannualCredits.Visible = false;
trHoursWorked.Visible = false;
}
else
{
trSemesterCredits.Visible = false;
trAnnualCredits.Visible = true;
trHoursWorked.Visible = true;
}
}
}
}