Trying to implement a VB rendition of the multi-value resources example I'm getting error in my web.config. Any ideas are appreciated.
web.config
web.config error:
Parser Error Message: Cannot create an abstract class.
Source Error:
Provider code:
Thanks
web.config
| <configSections> |
| <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> |
| <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> |
| <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" /> |
| <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> |
| <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere" /> |
| <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" /> |
| <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" /> |
| </sectionGroup> |
| </sectionGroup> |
| </sectionGroup> |
| <sectionGroup name="telerik.web.ui"> |
| <section name="radScheduler" type="Telerik.Web.UI.RadSchedulerConfigurationSection, Telerik.Web.UI, PublicKeyToken=121fae78165ba3d4" allowDefinition="MachineToApplication" requirePermission="false" /> |
| </sectionGroup> |
| </configSections> |
| ... |
| <telerik.web.ui> |
| <radScheduler defaultAppointmentProvider="Integrated"> |
| <appointmentProviders> |
| <add name="AppDbSchedulerProvider" |
| connectionStringName="dbMemberConnString" |
| type="AppScheduler.AppDbSchedulerProvider" |
| persistChanges="true" /> |
| </appointmentProviders> |
| </radScheduler> |
| </telerik.web.ui> |
web.config error:
Parser Error Message: Cannot create an abstract class.
Source Error:
|
Provider code:
| Imports System |
| Imports System.Collections.Generic |
| Imports System.Collections.Specialized |
| Imports System.Configuration |
| Imports System.Configuration.Provider |
| Imports System.Data |
| Imports System.Data.Common |
| Imports System.Data.SqlClient |
| Imports Telerik.Web.UI |
| Namespace AppScheduler |
| Public MustInherit Class AppDbSchedulerProvider |
| Inherits DbSchedulerProviderBase |
| Public Overloads Overrides Function GetAppointments(ByVal owner As RadScheduler) As IEnumerable(Of Appointment) |
| Dim appointments As New List(Of Appointment)() |
| Using conn As DbConnection = OpenConnection() |
| Dim cmd As DbCommand = DbFactory.CreateCommand() |
| cmd.Connection = conn |
| cmd.CommandText = "SELECT [ClassID], [Subject], [Start], [End], [RecurrenceRule], [RecurrenceParentId] FROM [DbProvider_Classes]" |
| Using reader As DbDataReader = cmd.ExecuteReader() |
| While reader.Read() |
| Dim apt As New Appointment() |
| apt.Owner = owner |
| apt.ID = reader("ClassID") |
| apt.Subject = Convert.ToString(reader("Subject")) |
| apt.Start = DateTime.SpecifyKind(Convert.ToDateTime(reader("Start")), DateTimeKind.Utc) |
| apt.[End] = DateTime.SpecifyKind(Convert.ToDateTime(reader("End")), DateTimeKind.Utc) |
| apt.RecurrenceRule = Convert.ToString(reader("RecurrenceRule")) |
| If Not apt.RecurrenceParentID Is Nothing Then |
| apt.RecurrenceParentID = reader("RecurrenceParentId") |
| End If |
| If apt.RecurrenceParentID <> Nothing Then |
| apt.RecurrenceState = RecurrenceState.Exception |
| ElseIf apt.RecurrenceRule <> String.Empty Then |
| apt.RecurrenceState = RecurrenceState.Master |
| End If |
| LoadResources(apt) |
| appointments.Add(apt) |
| End While |
| End Using |
| End Using |
| Return appointments |
| End Function |
| 'Public Overrides Sub Delete(ByVal owner As Telerik.Web.UI.RadScheduler, ByVal appointmentToDelete As Telerik.Web.UI.Appointment) |
| Public Overrides Sub Delete(ByVal owner As RadScheduler, ByVal appointmentToDelete As Appointment) |
| If Not PersistChanges Then |
| Return |
| End If |
| Using conn As DbConnection = OpenConnection() |
| Dim cmd As DbCommand = DbFactory.CreateCommand() |
| cmd.Connection = conn |
| Using tran As DbTransaction = conn.BeginTransaction() |
| cmd.Transaction = tran |
| ClearClassStudents(appointmentToDelete.ID, cmd) |
| cmd.Parameters.Clear() |
| cmd.Parameters.Add(CreateParameter("@ClassID", appointmentToDelete.ID)) |
| cmd.CommandText = "DELETE FROM [DbProvider_Classes] WHERE [ClassID] = @ClassID" |
| cmd.ExecuteNonQuery() |
| tran.Commit() |
| End Using |
| End Using |
| End Sub |
| Private Sub FillClassStudents(ByVal appointment As Appointment, ByVal cmd As DbCommand, ByVal classId As Object) |
| For Each student As Resource In appointment.Resources.GetResourcesByType("Student") |
| cmd.Parameters.Clear() |
| cmd.Parameters.Add(CreateParameter("@ClassID", classId)) |
| cmd.Parameters.Add(CreateParameter("@StudentID", student.Key)) |
| cmd.CommandText = "INSERT INTO [DbProvider_ClassStudents] ([ClassID], [StudentID]) VALUES (@ClassID, @StudentID)" |
| cmd.ExecuteNonQuery() |
| Next |
| End Sub |
| Private Sub ClearClassStudents(ByVal classId As Object, ByVal cmd As DbCommand) |
| cmd.Parameters.Clear() |
| cmd.Parameters.Add(CreateParameter("@ClassID", classId)) |
| cmd.CommandText = "DELETE FROM [DbProvider_ClassStudents] WHERE [ClassID] = @ClassID" |
| cmd.ExecuteNonQuery() |
| End Sub |
| Public Overrides Sub Insert(ByVal owner As RadScheduler, ByVal appointmentToInsert As Appointment) |
| If Not PersistChanges Then |
| Return |
| End If |
| Using conn As DbConnection = OpenConnection() |
| Using tran As DbTransaction = conn.BeginTransaction() |
| Dim cmd As DbCommand = DbFactory.CreateCommand() |
| cmd.Connection = conn |
| cmd.Transaction = tran |
| PopulateAppointmentParameters(cmd, appointmentToInsert) |
| cmd.CommandText = " INSERT INTO [DbProvider_Classes]([Subject], [Start], [End], [TeacherID], [RecurrenceRule], [RecurrenceParentID]) VALUES (@Subject, @Start, @End, @TeacherID, @RecurrenceRule, @RecurrenceParentID)" |
| If TypeOf DbFactory Is SqlClientFactory Then |
| cmd.CommandText += Environment.NewLine + "SELECT SCOPE_IDENTITY()" |
| Else |
| cmd.ExecuteNonQuery() |
| cmd.CommandText = "SELECT @@IDENTITY" |
| End If |
| Dim identity As Integer = Convert.ToInt32(cmd.ExecuteScalar()) |
| FillClassStudents(appointmentToInsert, cmd, identity) |
| tran.Commit() |
| End Using |
| End Using |
| End Sub |
| Public Overrides Sub Update(ByVal owner As RadScheduler, ByVal appointmentToUpdate As Appointment) |
| If Not PersistChanges Then |
| Return |
| End If |
| Using conn As DbConnection = OpenConnection() |
| Using tran As DbTransaction = conn.BeginTransaction() |
| Dim cmd As DbCommand = DbFactory.CreateCommand() |
| cmd.Connection = conn |
| cmd.Transaction = tran |
| PopulateAppointmentParameters(cmd, appointmentToUpdate) |
| cmd.Parameters.Add(CreateParameter("@ClassID", appointmentToUpdate.ID)) |
| cmd.CommandText = "UPDATE [DbProvider_Classes] SET [Subject] = @Subject, [Start] = @Start, [End] = @End, [TeacherID] = @TeacherID, [RecurrenceRule] = @RecurrenceRule, [RecurrenceParentID] = @RecurrenceParentID WHERE [ClassID] = @ClassID" |
| cmd.ExecuteNonQuery() |
| ClearClassStudents(appointmentToUpdate.ID, cmd) |
| FillClassStudents(appointmentToUpdate, cmd, appointmentToUpdate.ID) |
| tran.Commit() |
| End Using |
| End Using |
| End Sub |
| Public Overloads Overrides Function GetResourceTypes(ByVal owner As RadScheduler) As IEnumerable(Of ResourceType) |
| Dim resourceTypes As ResourceType() = New ResourceType(2) {} |
| resourceTypes(0) = New ResourceType("Teacher", False) |
| resourceTypes(1) = New ResourceType("Student", True) |
| Return resourceTypes |
| End Function |
| Private Sub LoadResources(ByVal apt As Appointment) |
| Using conn As DbConnection = OpenConnection() |
| Dim cmd As DbCommand = DbFactory.CreateCommand() |
| cmd.Connection = conn |
| cmd.Parameters.Add(CreateParameter("@ClassID", apt.ID)) |
| cmd.CommandText = "SELECT [TeacherID] FROM [DbProvider_Classes] WHERE [ClassID] = @ClassID AND [TeacherID] IS NOT NULL" |
| Using reader As DbDataReader = cmd.ExecuteReader() |
| If reader.Read() Then |
| Dim teacher As Resource = apt.Owner.Resources.GetResource("Teacher", reader("TeacherID")) |
| apt.Resources.Add(teacher) |
| End If |
| End Using |
| cmd.Parameters.Clear() |
| cmd.Parameters.Add(CreateParameter("@ClassID", apt.ID)) |
| cmd.CommandText = "SELECT [StudentID] FROM [DbProvider_ClassStudents] WHERE [ClassID] = @ClassID" |
| Using reader As DbDataReader = cmd.ExecuteReader() |
| While reader.Read() |
| Dim student As Resource = apt.Owner.Resources.GetResource("Student", reader("StudentID")) |
| apt.Resources.Add(student) |
| End While |
| End Using |
| End Using |
| End Sub |
| Public Overloads Overrides Function GetResourcesByType(ByVal owner As RadScheduler, ByVal resourceType As String) As IEnumerable(Of Resource) |
| Select Case resourceType |
| Case "Teacher" |
| Return GetTeachers() |
| Case "Student" |
| Return GetStudents() |
| Case Else |
| Throw New InvalidOperationException("Unknown resource type: resourceType") |
| End Select |
| End Function |
| Private Function GetTeachers() As IEnumerable(Of Resource) |
| Dim resources As New List(Of Resource)() |
| Using conn As DbConnection = OpenConnection() |
| Dim cmd As DbCommand = DbFactory.CreateCommand() |
| cmd.Connection = conn |
| cmd.CommandText = "SELECT [TeacherID], [Name], [Phone] FROM [DbProvider_Teachers]" |
| Using reader As DbDataReader = cmd.ExecuteReader() |
| While reader.Read() |
| Dim res As New Resource() |
| res.Type = "Teacher" |
| res.Key = reader("TeacherID") |
| res.Text = Convert.ToString(reader("Name")) |
| res.Attributes("Phone") = Convert.ToString(reader("Phone")) |
| resources.Add(res) |
| End While |
| End Using |
| End Using |
| Return resources |
| End Function |
| Private Function GetStudents() As IEnumerable(Of Resource) |
| Dim resources As New List(Of Resource)() |
| Using conn As DbConnection = OpenConnection() |
| Dim cmd As DbCommand = DbFactory.CreateCommand() |
| cmd.Connection = conn |
| cmd.CommandText = "SELECT [StudentID], [Name] FROM [DbProvider_Students]" |
| Using reader As DbDataReader = cmd.ExecuteReader() |
| While reader.Read() |
| Dim res As New Resource() |
| res.Type = "Student" |
| res.Key = reader("StudentID") |
| res.Text = Convert.ToString(reader("Name")) |
| resources.Add(res) |
| End While |
| End Using |
| End Using |
| Return resources |
| End Function |
| Private Sub PopulateAppointmentParameters(ByVal cmd As DbCommand, ByVal apt As Appointment) |
| cmd.Parameters.Add(CreateParameter("@Subject", apt.Subject)) |
| cmd.Parameters.Add(CreateParameter("@Start", apt.Start)) |
| cmd.Parameters.Add(CreateParameter("@End", apt.[End])) |
| Dim teacher As Resource = apt.Resources.GetResourceByType("Teacher") |
| Dim teacherId As Object = Nothing |
| If teacher <> Nothing Then |
| teacherteacherId = teacher.Key |
| End If |
| cmd.Parameters.Add(CreateParameter("@TeacherID", teacherId)) |
| Dim rrule As String = Nothing |
| If apt.RecurrenceRule <> String.Empty Then |
| rrule = apt.RecurrenceRule |
| End If |
| cmd.Parameters.Add(CreateParameter("@RecurrenceRule", rrule)) |
| Dim parentId As Object = Nothing |
| If apt.RecurrenceParentID <> Nothing Then |
| parentId = apt.RecurrenceParentID |
| End If |
| cmd.Parameters.Add(CreateParameter("@RecurrenceParentId", parentId)) |
| End Sub |
| End Class |
| End Namespace |
Thanks