Imports System.Data Imports System.Text Imports System.Windows.Forms Imports System.Xml Public Class clsHymn Implements ICloneable Private mguidHymnID As Guid Private m_objHymnal As clsHymnal Private m_intHymnNumber As Integer Private m_strHymnName As String Private m_objHymnTuneName As clsHymnTuneName Private m_blnObjectAlreadyPersisted As Boolean Public Sub New() mguidHymnID = Guid.NewGuid m_objHymnal = Nothing m_intHymnNumber = 0 m_strHymnName = "" m_objHymnTuneName = Nothing m_blnObjectAlreadyPersisted = False End Sub Public Sub New(ByVal objHymnal As clsHymnal, ByVal intHymnNumber As Integer, ByVal strHymnName As String, ByVal objHymnTuneName As clsHymnTuneName) mguidHymnID = Guid.NewGuid m_objHymnal = objHymnal m_intHymnNumber = intHymnNumber m_strHymnName = strHymnName m_objHymnTuneName = objHymnTuneName m_blnObjectAlreadyPersisted = False End Sub Public Sub New(ByVal guidHymnID As Guid) mguidHymnID = guidHymnID Dim ldbcmdCommand As New SqlClient.SqlCommand ldbcmdCommand.CommandText = "sel_hymn" ldbcmdCommand.CommandType = CommandType.StoredProcedure ' Set up parameter for stored procedure Dim prmHymnID As New SqlClient.SqlParameter prmHymnID.ParameterName = "@hymn_id" prmHymnID.SqlDbType = SqlDbType.UniqueIdentifier 'prmHymnID.Size = 5 prmHymnID.Value = guidHymnID ldbcmdCommand.Parameters.Add(prmHymnID) Dim ldbdsHymns As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand) If ldbdsHymns.Tables(0).Rows.Count > 0 Then Dim ldbrwRow As DataRow ldbrwRow = ldbdsHymns.Tables(0).Rows(0) PopulateFromDBRow(ldbrwRow) m_blnObjectAlreadyPersisted = True MyGlobals.AddCachedObject(Me, Me.HymnID.ToString) End If ldbdsHymns.Clear() End Sub Public Sub New(ByVal ldbrwRow As DataRow) PopulateFromDBRow(ldbrwRow) m_blnObjectAlreadyPersisted = True MyGlobals.AddCachedObject(Me, Me.HymnID.ToString) End Sub Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow) mguidHymnID = CType(ldbrwRow.Item("hymn_id"), Guid) If ldbrwRow.IsNull("hymnal_id") Then m_objHymnal = Nothing Else Dim guidHymnalID As Guid = CType(ldbrwRow.Item("hymnal_id"), Guid) If MyGlobals.CachedObjectExists(guidHymnalID.ToString) Then m_objHymnal = CType(MyGlobals.CachedObjectRetrieve(guidHymnalID.ToString), clsHymnal) Else m_objHymnal = New clsHymnal(guidHymnalID) End If End If m_intHymnNumber = CType(ldbrwRow.Item("hymn_number"), Integer) m_strHymnName = CType(ldbrwRow.Item("hymn_name"), String) If ldbrwRow.IsNull("hymn_tune_name_id") Then m_objHymnTuneName = Nothing Else Dim guidHymnTuneNameID As Guid = CType(ldbrwRow.Item("hymn_tune_name_id"), Guid) If MyGlobals.CachedObjectExists(guidHymnTuneNameID.ToString) Then m_objHymnTuneName = CType(MyGlobals.CachedObjectRetrieve(guidHymnTuneNameID.ToString), clsHymnTuneName) Else m_objHymnTuneName = New clsHymnTuneName(guidHymnTuneNameID) End If End If End Sub Public Function Delete() As Boolean Try MyGlobals.RemoveCachedObject(Me.HymnID.ToString) Dim ldbcmdCommand As New SqlClient.SqlCommand ldbcmdCommand.CommandText = "del_hymn" ldbcmdCommand.CommandType = CommandType.StoredProcedure ' Set up parameter for stored procedure Dim prmHymnID As New SqlClient.SqlParameter prmHymnID.ParameterName = "@hymn_id" prmHymnID.SqlDbType = SqlDbType.UniqueIdentifier 'prmHymnID.Size = 5 prmHymnID.Value = mguidHymnID ldbcmdCommand.Parameters.Add(prmHymnID) Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand) If lintRowsAffected > 0 Then Return True Else Return False End If Catch Return False End Try End Function Public Function Save() As Boolean Try If Not m_objHymnal Is Nothing Then If Not m_objHymnal.ItemAlreadyPersisted Then m_objHymnal.Save() End If End If If Not m_objHymnTuneName Is Nothing Then If Not m_objHymnTuneName.ItemAlreadyPersisted Then m_objHymnTuneName.Save() End If End If MyGlobals.AddCachedObject(Me, Me.HymnID.ToString) If m_blnObjectAlreadyPersisted Then Dim ldbcmdCommand As New SqlClient.SqlCommand ldbcmdCommand.CommandText = "upd_hymn" ldbcmdCommand.CommandType = CommandType.StoredProcedure ' Set up parameter for stored procedure Dim prmHymnID As New SqlClient.SqlParameter prmHymnID.ParameterName = "@hymn_id" prmHymnID.SqlDbType = SqlDbType.UniqueIdentifier 'prmHymnalID.Size = 5 prmHymnID.Value = mguidHymnID ldbcmdCommand.Parameters.Add(prmHymnID) ' Set up parameter for stored procedure Dim prmHymnalID As New SqlClient.SqlParameter prmHymnalID.ParameterName = "@hymnal_id" prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier 'prmHymnalID.Size = 5 If m_objHymnal Is Nothing Then prmHymnalID.Value = DBNull.Value Else prmHymnalID.Value = m_objHymnal.HymnalID End If ldbcmdCommand.Parameters.Add(prmHymnalID) ' Set up parameter for stored procedure Dim prmHymnNumber As New SqlClient.SqlParameter prmHymnNumber.ParameterName = "@hymn_number" prmHymnNumber.SqlDbType = SqlDbType.Int 'prmHymnNumber.Size = 5 prmHymnNumber.Value = m_intHymnNumber ldbcmdCommand.Parameters.Add(prmHymnNumber) ' Set up parameter for stored procedure Dim prmHymnName As New SqlClient.SqlParameter prmHymnName.ParameterName = "@hymn_name" prmHymnName.SqlDbType = SqlDbType.VarChar prmHymnName.Size = MyGlobals.HYMN_NAME_SIZE prmHymnName.Value = m_strHymnName ldbcmdCommand.Parameters.Add(prmHymnName) ' Set up parameter for stored procedure Dim prmHymnTuneNameID As New SqlClient.SqlParameter prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id" prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier 'prmHymnTuneNameID.Size = 5 If m_objHymnTuneName Is Nothing Then prmHymnTuneNameID.Value = DBNull.Value Else prmHymnTuneNameID.Value = m_objHymnTuneName.HymnTuneNameID End If ldbcmdCommand.Parameters.Add(prmHymnTuneNameID) Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand) If lintRowsAffected > 0 Then Return True Else Return False End If Else Dim ldbcmdCommand As New SqlClient.SqlCommand ldbcmdCommand.CommandText = "ins_hymn" ldbcmdCommand.CommandType = CommandType.StoredProcedure ' Set up parameter for stored procedure Dim prmHymnID As New SqlClient.SqlParameter prmHymnID.ParameterName = "@hymn_id" prmHymnID.SqlDbType = SqlDbType.UniqueIdentifier 'prmHymnalID.Size = 5 prmHymnID.Value = mguidHymnID ldbcmdCommand.Parameters.Add(prmHymnID) ' Set up parameter for stored procedure Dim prmHymnalID As New SqlClient.SqlParameter prmHymnalID.ParameterName = "@hymnal_id" prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier 'prmHymnalID.Size = 5 If m_objHymnal Is Nothing Then prmHymnalID.Value = DBNull.Value Else prmHymnalID.Value = m_objHymnal.HymnalID End If ldbcmdCommand.Parameters.Add(prmHymnalID) Dim prmHymnNumber As New SqlClient.SqlParameter prmHymnNumber.ParameterName = "@hymn_number" prmHymnNumber.SqlDbType = SqlDbType.Int 'prmHymnNumber.Size = 5 prmHymnNumber.Value = m_intHymnNumber ldbcmdCommand.Parameters.Add(prmHymnNumber) ' Set up parameter for stored procedure Dim prmHymnName As New SqlClient.SqlParameter prmHymnName.ParameterName = "@hymn_name" prmHymnName.SqlDbType = SqlDbType.VarChar prmHymnName.Size = MyGlobals.HYMN_NAME_SIZE prmHymnName.Value = m_strHymnName ldbcmdCommand.Parameters.Add(prmHymnName) ' Set up parameter for stored procedure Dim prmHymnTuneNameID As New SqlClient.SqlParameter prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id" prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier 'prmHymnTuneNameID.Size = 5 If m_objHymnTuneName Is Nothing Then prmHymnTuneNameID.Value = DBNull.Value Else prmHymnTuneNameID.Value = m_objHymnTuneName.HymnTuneNameID End If ldbcmdCommand.Parameters.Add(prmHymnTuneNameID) Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand) If lintRowsAffected > 0 Then m_blnObjectAlreadyPersisted = True Return True Else Return False End If End If Catch e As SqlClient.SqlException MessageBox.Show(e.Message) Return False Catch Return False End Try End Function Public Property HymnID() As Guid Get Return mguidHymnID End Get Set(ByVal Value As Guid) mguidHymnID = Value End Set End Property Public Property Hymnal() As clsHymnal Get Return m_objHymnal End Get Set(ByVal Value As clsHymnal) m_objHymnal = Value End Set End Property Public Property HymnNumber() As Integer Get Return m_intHymnNumber End Get Set(ByVal Value As Integer) m_intHymnNumber = Value End Set End Property Public Property HymnNumberAsString() As String Get Return m_intHymnNumber.ToString End Get Set(ByVal Value As String) If Val(Value) > 0 Then m_intHymnNumber = CType(Value, Integer) Else m_intHymnNumber = 0 End If End Set End Property Public Property HymnName() As String Get Return m_strHymnName End Get Set(ByVal Value As String) m_strHymnName = Value.Trim End Set End Property Public Property HymnTuneName() As clsHymnTuneName Get Return m_objHymnTuneName End Get Set(ByVal Value As clsHymnTuneName) m_objHymnTuneName = Value End Set End Property Public Property ItemAlreadyPersisted() As Boolean Get Return m_blnObjectAlreadyPersisted End Get Set(ByVal Value As Boolean) m_blnObjectAlreadyPersisted = Value End Set End Property Public Function Clone() As Object Implements ICloneable.Clone Dim lobjReturnValue As New clsHymn lobjReturnValue.HymnID = Me.HymnID lobjReturnValue.Hymnal = Me.Hymnal lobjReturnValue.HymnNumber = Me.HymnNumber lobjReturnValue.HymnName = Me.HymnName lobjReturnValue.HymnTuneName = Me.HymnTuneName lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted Return lobjReturnValue End Function Public Function StateIsIdentical(ByVal lobjOtherHymn As clsHymn) As Boolean Dim blnResult As Boolean If Me.HymnID.Equals(lobjOtherHymn.HymnID) _ AndAlso Me.HymnNumber = lobjOtherHymn.HymnNumber _ AndAlso Me.HymnName = lobjOtherHymn.HymnName Then blnResult = True If Me.Hymnal Is Nothing Then If lobjOtherHymn.Hymnal Is Nothing Then 'OK Else Return False End If Else If lobjOtherHymn.Hymnal Is Nothing Then Return False Else blnResult = Me.Hymnal.HymnalID.Equals(lobjOtherHymn.Hymnal.HymnalID) End If End If If Not blnResult Then Return False End If If Me.HymnTuneName Is Nothing Then If lobjOtherHymn.HymnTuneName Is Nothing Then 'OK Else Return False End If Else If lobjOtherHymn.HymnTuneName Is Nothing Then Return False Else blnResult = Me.HymnTuneName.HymnTuneNameID.Equals(lobjOtherHymn.HymnTuneName.HymnTuneNameID) End If End If Else Return False End If Return blnResult End Function Public Function Validate(ByRef lstrErrorString As String) As Boolean lstrErrorString = "" If Me.Hymnal Is Nothing Then lstrErrorString = "Hymnal is required" Return False End If If Me.HymnNumber = 0 Then lstrErrorString = "Hymn Number is required and must be numeric" Return False End If If Me.HymnName.Length = 0 Then lstrErrorString = "Hymn Name is required" Return False End If If Me.HymnTuneName Is Nothing Then lstrErrorString = "HymnTuneName is required" Return False End If Return True End Function Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean lstrReferencedByString = "" Return True End Function Public Overrides Function ToString() As String Dim strReturnString As New StringBuilder If m_objHymnal Is Nothing Then 'strReturnString.Append(MyGlobals.COLLECTION_STRING) Else strReturnString.Append(m_objHymnal.HymnalAbbreviation) End If strReturnString.Append(m_intHymnNumber) strReturnString.Append(" - ") strReturnString.Append(m_strHymnName) Return strReturnString.ToString End Function Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter) objXMLWriter.WriteStartElement("Hymn") objXMLWriter.WriteElementString("HymnID", Me.HymnID.ToString) objXMLWriter.WriteElementString("HymnName", Me.HymnName) objXMLWriter.WriteElementString("HymnNumber", Me.HymnNumberAsString) objXMLWriter.WriteElementString("HymnalID", Me.Hymnal.HymnalID.ToString) Me.Hymnal.WriteXML(objXMLWriter) If Me.HymnTuneName Is Nothing Then objXMLWriter.WriteElementString("HymnTuneNameID", "") Else objXMLWriter.WriteElementString("HymnTuneNameID", Me.HymnTuneName.HymnTuneNameID.ToString) Me.HymnTuneName.WriteXML(objXMLWriter) End If objXMLWriter.WriteEndElement() End Sub Public Shared Function GetAllHymns() As System.Collections.Generic.List(Of clsHymn) 'Preload to cache clsHymnTuneName.AddAllHymnTuneNamesToCache() clsHymnal.AddAllHymnalsToCache() Dim lguidHymnID As Guid Dim ldbcmdCommand As New SqlClient.SqlCommand Dim lobjHymn As clsHymn Dim lcolHymns As New System.Collections.Generic.List(Of clsHymn) ldbcmdCommand.CommandText = "sel_hymn_all" ldbcmdCommand.CommandType = CommandType.StoredProcedure Dim ldbdsHymns As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand) If ldbdsHymns.Tables(0).Rows.Count > 0 Then Dim ldbrwRow As DataRow For Each ldbrwRow In ldbdsHymns.Tables(0).Rows lguidHymnID = CType(ldbrwRow.Item("hymn_id"), Guid) If MyGlobals.CachedObjectExists(lguidHymnID.ToString) Then lobjHymn = CType(MyGlobals.CachedObjectRetrieve(lguidHymnID.ToString), clsHymn) Else 'lobjHymn = New clsHymn(lguidHymnID) lobjHymn = New clsHymn(ldbrwRow) End If lcolHymns.Add(lobjHymn) Next End If ldbdsHymns.Clear() Return lcolHymns End Function End Class