Stack Trace:
|
Provider file:
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Configuration.Provider;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using Telerik.Web.UI;
public class WorldBridgeSchedulerProvider : DbSchedulerProviderBase
{
public override IEnumerable<Appointment> GetAppointments(RadScheduler owner)
{
List<Appointment> exceptions = new List<Appointment>();
using (DbConnection conn = OpenConnection())
{
DbCommand cmd = DbFactory.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT [VACExceptionID], [Reason], [StartDate], [EndDate], [RecurrenceRule], [RecurrenceParentId] FROM [VACException]";
using (DbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Appointment apt = new Appointment();
apt.Owner = owner;
apt.ID = reader["VACExceptionID"];
apt.Subject = Convert.ToString(reader["Reason"]);
apt.Start = DateTime.SpecifyKind(Convert.ToDateTime(reader["StartDate"]), DateTimeKind.Utc);
apt.End = DateTime.SpecifyKind(Convert.ToDateTime(reader["EndDate"]), DateTimeKind.Utc);
apt.RecurrenceRule = Convert.ToString(reader["RecurrenceRule"]);
apt.RecurrenceParentID = reader["RecurrenceParentId"] == DBNull.Value ? null : reader["RecurrenceParentId"];
if (apt.RecurrenceParentID != null)
{
apt.RecurrenceState = RecurrenceState.Exception;
}
else
if (apt.RecurrenceRule != string.Empty)
{
apt.RecurrenceState = RecurrenceState.Master;
}
LoadResources(apt);
exceptions.Add(apt);
}
}
}
return exceptions;
}
public override void Insert(RadScheduler owner, Appointment appointmentToInsert)
{
if (!PersistChanges)
{
return;
}
using (DbConnection conn = OpenConnection())
{
using (DbTransaction tran = conn.BeginTransaction())
{
DbCommand cmd = DbFactory.CreateCommand();
cmd.Connection = conn;
cmd.Transaction = tran;
PopulateAppointmentParameters(cmd, appointmentToInsert);
cmd.CommandText =
@" INSERT INTO [VACException]
([Reason], [StartDate], [EndDate], [VACID],
[RecurrenceRule], [RecurrenceParentID])
VALUES (@Reason, @StartDate, @EndDate, @VACID,
@RecurrenceRule, @RecurrenceParentID)";
if (DbFactory is SqlClientFactory)
{
cmd.CommandText += Environment.NewLine + "SELECT SCOPE_IDENTITY()";
}
else
{
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT @@IDENTITY";
}
int identity = Convert.ToInt32(cmd.ExecuteScalar());
//FillClassStudents(appointmentToInsert, cmd, identity);
tran.Commit();
}
}
}
public override void Update(RadScheduler owner, Appointment appointmentToUpdate)
{
if (!PersistChanges)
{
return;
}
using (DbConnection conn = OpenConnection())
{
using (DbTransaction tran = conn.BeginTransaction())
{
DbCommand cmd = DbFactory.CreateCommand();
cmd.Connection = conn;
cmd.Transaction = tran;
PopulateAppointmentParameters(cmd, appointmentToUpdate);
cmd.Parameters.Add(CreateParameter("@VACExceptionID", appointmentToUpdate.ID));
cmd.CommandText = "UPDATE [VACException] SET [Reason] = @Reason, [StartDate] = @StartDate, [EndDate] = @EndDate, [VACID] = @VACID, [RecurrenceRule] = @RecurrenceRule, [RecurrenceParentID] = @RecurrenceParentID WHERE [VACExceptionID] = @VACExceptionID";
cmd.ExecuteNonQuery();
//ClearClassStudents(appointmentToUpdate.ID, cmd);
//FillClassStudents(appointmentToUpdate, cmd, appointmentToUpdate.ID);
tran.Commit();
}
}
}
public override void Delete(RadScheduler owner, Appointment appointmentToDelete)
{
if (!PersistChanges)
{
return;
}
using (DbConnection conn = OpenConnection())
{
DbCommand cmd = DbFactory.CreateCommand();
cmd.Connection = conn;
using (DbTransaction tran = conn.BeginTransaction())
{
cmd.Transaction = tran;
//ClearClassStudents(appointmentToDelete.ID, cmd);
cmd.Parameters.Clear();
cmd.Parameters.Add(CreateParameter("@VACExceptionID", appointmentToDelete.ID));
cmd.CommandText = "DELETE FROM [VACException] WHERE [VACExceptionID] = @VACExceptionID";
cmd.ExecuteNonQuery();
tran.Commit();
}
}
}
public override IEnumerable<ResourceType> GetResourceTypes(RadScheduler owner)
{
ResourceType[] resourceTypes = new ResourceType[2];
resourceTypes[0] = new ResourceType("VAC", false);
return resourceTypes;
}
public override IEnumerable<Resource> GetResourcesByType(RadScheduler owner, string resourceType)
{
switch (resourceType)
{
case "VAC":
return GetVACs();
default:
throw new InvalidOperationException("Unknown resource type: " + resourceType);
}
}
private void LoadResources(Appointment apt)
{
using (DbConnection conn = OpenConnection())
{
DbCommand cmd = DbFactory.CreateCommand();
cmd.Connection = conn;
cmd.Parameters.Add(CreateParameter("@VACExceptionID", apt.ID));
cmd.CommandText = "SELECT [VACID] FROM [VACException] WHERE [VACExceptionID] = @VACExceptionID AND [VACID] IS NOT NULL";
using (DbDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
Resource VAC = apt.Owner.Resources.GetResource("VAC", reader["VACID"]);
apt.Resources.Add(VAC);
}
}
}
}
private IEnumerable<Resource> GetVACs()
{
List<Resource> resources = new List<Resource>();
using (DbConnection conn = OpenConnection())
{
DbCommand cmd = DbFactory.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT [VACID], [VACName] FROM [VAC]";
using (DbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Resource res = new Resource();
res.Type = "VAC";
res.Key = reader["VACID"];
res.Text = Convert.ToString(reader["VACName"]);
resources.Add(res);
}
}
}
return resources;
}
private void PopulateAppointmentParameters(DbCommand cmd, Appointment apt)
{
cmd.Parameters.Add(CreateParameter("@Reason", apt.Subject));
cmd.Parameters.Add(CreateParameter("@StartDate", apt.Start));
cmd.Parameters.Add(CreateParameter("@EndDate", apt.End));
Resource VAC = apt.Resources.GetResourceByType("VAC");
object VACID = null;
if (VAC != null)
{
VACID = VAC.Key;
}
cmd.Parameters.Add(CreateParameter("@VACID", VACID));
string rrule = null;
if (apt.RecurrenceRule != string.Empty)
{
rrule = apt.RecurrenceRule;
}
cmd.Parameters.Add(CreateParameter("@RecurrenceRule", rrule));
object parentId = null;
if (apt.RecurrenceParentID != null)
{
parentId = apt.RecurrenceParentID;
}
cmd.Parameters.Add(CreateParameter("@RecurrenceParentId", parentId));
}
}
Create Scripts for the tables:
CREATE TABLE [dbo].[VAC](
[VACID] [int] IDENTITY(1,1) NOT NULL,
[VACName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
CONSTRAINT [PK_VAC_1] PRIMARY KEY CLUSTERED
(
[VACID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[VACException](
[VACExceptionID] [int] IDENTITY(1,1) NOT NULL,
[VACID] [int] NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NOT NULL,
[Reason] [nvarchar](250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[RecurrenceRule] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[RecurrenceParentID] [int] NULL,
CONSTRAINT [PK_VACException] PRIMARY KEY CLUSTERED
(
[VACExceptionID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
GO
ALTER TABLE [dbo].[VACException] WITH CHECK ADD CONSTRAINT [FK_VACException_VAC] FOREIGN KEY([VACID])
REFERENCES [dbo].[VAC] ([VACID])