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;

}

}

}

}