Feedback

DataTable: schnelle Erstellung eines DataRow-Objekts

Sprache: VB

Manchmal benötigt man schnell eine Daten-Klasse (DataFactory), die eine Zeile einer DataTable zurückgibt. Natürlich mit schnellem Austausch der Daten gegenseitig und komfortablen Zugriff auf die Daten per Feldnamen. Vorgehensweise: 1. Einmalig eine abstrakte Klasse erstellen, immer wieder verwendbar (hier: DataClass(Of T)). 2. Datenfeldnamen einer Tabelle in einer Enumerations festlegen. 3. Erstellung der Datenklasse (6 Zeilen) mit Inherits DataClass und Verweis auf die Eunumeration.
'	Erstellen der abstrakten Klasse
<Serializable()> Public MustInherit Class DataClass(Of T)
        Implements IDisposable

        Private Values As Dictionary(Of T, Object)
        Private Columns As List(Of T)
        Private m_ErrMsgDataRow As String = ""

        Public Sub New()
            Values = New Dictionary(Of T, Object)
            Columns = New List(Of T)
            Columns.AddRange(CType([Enum].GetValues(GetType(T)), _
                             Global.System.Collections.Generic.IEnumerable(Of T)))
        End Sub

        ''' <summary>
        ''' Anzahl der Felder, die Datenwerte enthalten können
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ReadOnly Property Fields() As List(Of T)
            Get
                Return Columns
            End Get
        End Property

        ''' <summary>
        ''' Anzahl der Datenwerte
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ReadOnly Property CountValues() As Integer
            Get
                Return Values.Count
            End Get
        End Property

        ''' <summary>
        ''' überprüft ob alle Datenfelder einen Wert haben
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ReadOnly Property HasAllFieldsDatas() As Boolean
            Get
                Return CBool(Values.Count = Columns.Count)
            End Get
        End Property

        ''' <summary>
        ''' Gibt den Wert eines Elements zurück
        ''' </summary>
        ''' <param name="e"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetItem(ByVal e As T) As Object
            Try
                If Me.Values(e) Is Nothing Then Me.Values(e) = ""
                Return Me.Values(e)
            Catch : End Try
            Return Nothing
        End Function

        ''' <summary>
        ''' Setzt den Wert eines Elements
        ''' </summary>
        ''' <param name="Value"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Public Sub SetItem(ByVal e As T, ByVal Value As Object)
            Me.Values(e) = Value
        End Sub

        ''' <summary>
        ''' Setzt die Daten einer Zeile in die Klasse um
        ''' </summary>
        ''' <param name="row"></param>
        ''' <remarks></remarks>
        Public Sub Fill_Class(ByVal row As DataRow)
            m_ErrMsgDataRow = ""
            If row IsNot Nothing Then
                For Each p As T In Columns
                    Try
                        SetItem(p, row(p.ToString))
                    Catch ex As Exception
                        m_ErrMsgDataRow += ex.Message + ControlChars.NewLine
                    End Try
                Next
                Exit Sub
            End If
            m_ErrMsgDataRow = "Datenobjekt ist Nothing."
        End Sub

        ''' <summary>
        ''' Liest die Variablen in das DataRow ein
        ''' </summary>
        ''' <param name="row"></param>
        ''' <remarks></remarks>
        Public Sub Fill_DataRow(ByVal row As DataRow, Optional ByVal AndAddToTable As Boolean = False)
            m_ErrMsgDataRow = ""
            If row IsNot Nothing Then
                For Each p As T In Columns
                    Try
                        row(p.ToString) = GetItem(p)
                    Catch ex As Exception
                        m_ErrMsgDataRow += ex.Message + ControlChars.NewLine
                    End Try
                Next
                If AndAddToTable Then row.Table.Rows.Add(row)
                Exit Sub
            End If
            m_ErrMsgDataRow = "Datenobjekt ist Nothing."
        End Sub

        ''' <summary>
        ''' Gibt die Fehler zurück, die im Zusammenhang mit
        ''' einen DataRow-Objekt entstanden sind.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ReadOnly Property ErrMsgFromDataRow() As String
            Get
                Return m_ErrMsgDataRow
            End Get
        End Property

#Region " IDisposable Support "
        Private disposedValue As Boolean = False        
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    Values = Nothing: Columns = Nothing
                End If
                ' TODO: free your own state (unmanaged objects).
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub
        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region
    
End Class

'	Datenfeldnamen festlegen
Public Enum FieldsKontoInfo
        ID
        KontoNr
        Blz
        Bank
        Bez
        Inhaber
        Iban
        Swift
        DatumGesperrtAb
        DatumErstelltAm
        BetragStart
End Enum

'	Erstellung der Datenklasse
'	mit komfortablem Zugriff auf die Daten per Feldnamen
Public Class ClsKontoInfo
        Inherits DataClass(Of FieldsKontoInfo)

        Public Sub New()
            MyBase.New()
        End Sub
End Class
'	Erstellen der abstrakten Klasse
<Serializable()> Public MustInherit Class DataClass(Of T)
        Implements IDisposable

        Private Values As Dictionary(Of T, Object)
        Private Columns As List(Of T)
        Private m_ErrMsgDataRow As String = ""

        Public Sub New()
            Values = New Dictionary(Of T, Object)
            Columns = New List(Of T)
            Columns.AddRange(CType([Enum].GetValues(GetType(T)), _
                             Global.System.Collections.Generic.IEnumerable(Of T)))
        End Sub

        ''' <summary>
        ''' Anzahl der Felder, die Datenwerte enthalten können
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ReadOnly Property Fields() As List(Of T)
            Get
                Return Columns
            End Get
        End Property

        ''' <summary>
        ''' Anzahl der Datenwerte
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ReadOnly Property CountValues() As Integer
            Get
                Return Values.Count
            End Get
        End Property

        ''' <summary>
        ''' überprüft ob alle Datenfelder einen Wert haben
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ReadOnly Property HasAllFieldsDatas() As Boolean
            Get
                Return CBool(Values.Count = Columns.Count)
            End Get
        End Property

        ''' <summary>
        ''' Gibt den Wert eines Elements zurück
        ''' </summary>
        ''' <param name="e"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetItem(ByVal e As T) As Object
            Try
                If Me.Values(e) Is Nothing Then Me.Values(e) = ""
                Return Me.Values(e)
            Catch : End Try
            Return Nothing
        End Function

        ''' <summary>
        ''' Setzt den Wert eines Elements
        ''' </summary>
        ''' <param name="Value"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Public Sub SetItem(ByVal e As T, ByVal Value As Object)
            Me.Values(e) = Value
        End Sub

        ''' <summary>
        ''' Setzt die Daten einer Zeile in die Klasse um
        ''' </summary>
        ''' <param name="row"></param>
        ''' <remarks></remarks>
        Public Sub Fill_Class(ByVal row As DataRow)
            m_ErrMsgDataRow = ""
            If row IsNot Nothing Then
                For Each p As T In Columns
                    Try
                        SetItem(p, row(p.ToString))
                    Catch ex As Exception
                        m_ErrMsgDataRow += ex.Message + ControlChars.NewLine
                    End Try
                Next
                Exit Sub
            End If
            m_ErrMsgDataRow = "Datenobjekt ist Nothing."
        End Sub

        ''' <summary>
        ''' Liest die Variablen in das DataRow ein
        ''' </summary>
        ''' <param name="row"></param>
        ''' <remarks></remarks>
        Public Sub Fill_DataRow(ByVal row As DataRow, Optional ByVal AndAddToTable As Boolean = False)
            m_ErrMsgDataRow = ""
            If row IsNot Nothing Then
                For Each p As T In Columns
                    Try
                        row(p.ToString) = GetItem(p)
                    Catch ex As Exception
                        m_ErrMsgDataRow += ex.Message + ControlChars.NewLine
                    End Try
                Next
                If AndAddToTable Then row.Table.Rows.Add(row)
                Exit Sub
            End If
            m_ErrMsgDataRow = "Datenobjekt ist Nothing."
        End Sub

        ''' <summary>
        ''' Gibt die Fehler zurück, die im Zusammenhang mit
        ''' einen DataRow-Objekt entstanden sind.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ReadOnly Property ErrMsgFromDataRow() As String
            Get
                Return m_ErrMsgDataRow
            End Get
        End Property

#Region " IDisposable Support "
        Private disposedValue As Boolean = False        
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    Values = Nothing: Columns = Nothing
                End If
                ' TODO: free your own state (unmanaged objects).
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub
        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region
    
End Class

'	Datenfeldnamen festlegen
Public Enum FieldsKontoInfo
        ID
        KontoNr
        Blz
        Bank
        Bez
        Inhaber
        Iban
        Swift
        DatumGesperrtAb
        DatumErstelltAm
        BetragStart
End Enum

'	Erstellung der Datenklasse
'	mit komfortablem Zugriff auf die Daten per Feldnamen
Public Class ClsKontoInfo
        Inherits DataClass(Of FieldsKontoInfo)

        Public Sub New()
            MyBase.New()
        End Sub
End Class