Imports System.Data
Imports System.Data.SqlClient

Public Class Kurs

#Region "Konstruktoren"
    Public Sub New()
        ' Parameterloser Konstruktor -> Zwecks neuer Kurse, Identifikation über fehlende ID
    End Sub

    Public Sub New(ByVal ID As Integer)
        Using conVerbindung As New SqlConnection(My.Settings.strConString)
            Dim cmdSelect As SqlCommand
            cmdSelect = New SqlCommand
            With cmdSelect
                .CommandText = "SELECT * FROM kurse WHERE id = " & ID
                .Connection = conVerbindung
            End With

            conVerbindung.Open()
            Dim drReader As SqlDataReader
            drReader = cmdSelect.ExecuteReader()

            While drReader.Read()
                _intID = ID
                _strLand = drReader("Land")
                _strSortenzeichen = drReader("WKZ")
                _dblKurs = CDbl(drReader("Kurs"))
            End While
        End Using
    End Sub
#End Region

#Region "Eigenschaften"
    Private _intID As Integer
    Public Property ID() As String
        Get
            Return _intID
        End Get
        Set(ByVal value As String)
            _intID = value
        End Set
    End Property

    Private _strSortenzeichen As String
    Public Property Sortenzeichen() As String
        Get
            Return _strSortenzeichen
        End Get
        Set(ByVal value As String)
            _strSortenzeichen = value
        End Set
    End Property

    Private _dblKurs As Double
    Public Property Kurs() As Double
        Get
            Return _dblKurs
        End Get
        Set(ByVal value As Double)
            value = _dblKurs
        End Set
    End Property


    Private _strLand As String
    Public Property Land() As String
        Get
            Return _strLand
        End Get
        Set(ByVal value As String)
            _strLand = value
        End Set
    End Property

#End Region

#Region "Methoden"

    Public Sub Save()
        If _intID > 0 Then
            ' Datensatz existiert bereits -> UPDATE
            Using conVerbindung As New SqlConnection(My.Settings.strConString)
                Dim cmdUpdate As SqlCommand = New SqlCommand
                With cmdUpdate
                    .CommandText = "UPDATE kurse SET land = '" & _strLand & "', " _
                                        & "wkz = '" & _strSortenzeichen & "', " _
                                        & "kurs = @Kurs" _
                                        & " WHERE id = " & _intID
                    ' Double-Werte in SQL-Strings sind kritisch wg. Trennzeichen, 
                    ' daher hier Verwendung von Parametern.
                    .Connection = conVerbindung
                End With
                ' Parameter für den Double-Wert
                Dim parKurs As SqlParameter = New SqlParameter()
                With parKurs
                    .ParameterName = "@Kurs"
                    .Value = _dblKurs
                End With
                ' Parameter dem SQL-Kommando zuordnen
                cmdUpdate.Parameters.Add(parKurs)

                ' Update durchführen
                conVerbindung.Open()
                Dim intRowsAffected As Integer
                intRowsAffected = cmdUpdate.ExecuteNonQuery()

                ' TODO: Falls intRowsAffected <> 1 -> EXCEPTION!
            End Using
        Else
            ' Datensatz ist neu -> INSERT
            Using conVerbindung As New SqlConnection(My.Settings.strConString)
                Dim cmdInsert As New SqlCommand
                With cmdInsert
                    .CommandText = "INSERT INTO kurse (land, wkz, kurs)" & _
                                    " VALUES ('" & _strLand & "', '" & _strSortenzeichen & "', @Kurs)"
                    .Connection = conVerbindung
                End With
                ' Parameter für den Double-Wert
                Dim parKurs As SqlParameter = New SqlParameter()
                With parKurs
                    .ParameterName = "@Kurs"
                    .Value = _dblKurs
                End With
                cmdInsert.Parameters.Add(parKurs)

                ' Insert durchführen
                conVerbindung.Open()
                Dim intRowsAffected As Integer
                intRowsAffected = cmdInsert.ExecuteNonQuery()
                ' TODO: Falls intRowsAffected <> 1 -> EXCEPTION!

                ' Zuletzt vergebene ID per StoredProcedure ermitteln
                Dim cmdLetzteID As New SqlCommand
                With cmdLetzteID
                    .CommandText = "SELECT ident_current('kurse')"
                    .Connection = conVerbindung
                End With

                ' HACK:  Die StoredProcedure liefert nur dann zuverlässig die zuletzt
                '      vergebene ID, wenn der gesamte Insert innerhalb einer Transaktion
                '      abgewickelt wird - hier aus Übersichtlichkeitsgründen nicht verwendet.
                Dim objErgebnis As Object
                objErgebnis = cmdLetzteID.ExecuteScalar()
                Dim intLetzteID As Integer
                intLetzteID = CInt(objErgebnis)
                ' TODO: Exceptionhandling für Casting, SQL-Exceptions etc.!
                _intID = intLetzteID
            End Using
        End If
    End Sub

    Public Sub Delete()
        ' TODO: Löschen des Datensatzes implementieren
        Throw New NotImplementedException
    End Sub

    Public Overrides Function ToString() As String
        Return _strSortenzeichen
    End Function

#End Region

End Class
