Imports Oracle.ManagedDataAccess.Client
Imports System.Data.Odbc

Public Class ClassDatabase
    Private Shared connectionString As String

    Public Shared Function Init()
        Try
            connectionString = MyConnectionString
            Dim SQLconnect As New SqlClient.SqlConnection
            SQLconnect.ConnectionString = connectionString
            SQLconnect.Open()
            SQLconnect.Close()
            Return True
        Catch ex As Exception
            ClassLogger.Add("Fehler bei DatabaseInit: " & ex.Message, True)
            Return False
        End Try
    End Function
    Public Shared Function GetConnectionString(id As Integer)
        Dim connectionString As String = ""
        Try
            'Me.TBCONNECTIONTableAdapter.FillByID(Me.DD_DMSLiteDataSet.TBCONNECTION, id)
            Dim DTConnection As DataTable = ClassDatabase.Return_Datatable("SELECT * FROM TBDD_CONNECTION WHERE GUID = " & id)
            If DTConnection.Rows.Count = 1 Then
                Select Case DTConnection.Rows(0).Item("SQL_PROVIDER")
                    Case "MS-SQLServer"
                        If DTConnection.Rows(0).Item("USERNAME") = "WINAUTH" Then
                            connectionString = "Server=" & DTConnection.Rows(0).Item("SERVER") & ";Database=" & DTConnection.Rows(0).Item("DATENBANK") & ";Trusted_Connection=True;"
                        Else
                            connectionString = "Server=" & DTConnection.Rows(0).Item("SERVER") & ";Database=" & DTConnection.Rows(0).Item("DATENBANK") & ";User Id=" & DTConnection.Rows(0).Item("USERNAME") & ";Password=" & DTConnection.Rows(0).Item("USERNAME") & ";Password=" & DTConnection.Rows(0).Item("PASSWORD") & ";"
                        End If
                        ' connectionString = "Server=" & DTConnection.Rows(0).Item("SERVER") & ";Database=" & DTConnection.Rows(0).Item("DATENBANK") & ";User Id=" & DTConnection.Rows(0).Item("USERNAME") & ";Password=" & DTConnection.Rows(0).Item("PASSWORD") & ";"
                    Case "Oracle"
                        If DTConnection.Rows(0).Item("BEMERKUNG").ToString.Contains("without tnsnames") Then
                            connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" & DTConnection.Rows(0).Item("SERVER") & ")(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=" & _
                               DTConnection.Rows(0).Item("DATENBANK") & ")));User Id=" & DTConnection.Rows(0).Item("USERNAME") & ";Password=" & DTConnection.Rows(0).Item("PASSWORD") & ";"
                        Else
                            connectionString = "Data Source=" & DTConnection.Rows(0).Item("SERVER") & ";Persist Security Info=True;User Id=" & DTConnection.Rows(0).Item("USERNAME") & ";Password=" & DTConnection.Rows(0).Item("PASSWORD") & ";Unicode=True"
                        End If
                    Case "ODBC"
                        Dim conn As New OdbcConnection("dsn=" & DTConnection.Rows(0).Item("SERVER") & ";uid=" & DTConnection.Rows(0).Item("USERNAME") & ";pwd=" + DTConnection.Rows(0).Item("PASSWORD"))
                        connectionString = conn.ConnectionString
                    Case Else
                        ClassLogger.Add(" - ConnectionType nicht integriert", False)
                        MsgBox("ConnectionType nicht integriert", MsgBoxStyle.Critical, "Bitte Konfiguration Connection überprüfen!")
                End Select
            Else
                ClassLogger.Add(" No entry for Connection-ID: " & id.ToString, True)
            End If

        Catch ex As Exception
            ClassLogger.Add(" - Unvorhergesehener Fehler bei GetConnectionString - Fehler: " & vbNewLine & ex.Message)
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei GetConnectionString:")
        End Try
        Return connectionString
    End Function
    Public Shared Function Return_Datatable(Select_anweisung As String, Optional CallMethod As String = "")
        Try
            Dim SQLconnect As New SqlClient.SqlConnection
            Dim SQLcommand As SqlClient.SqlCommand
            SQLconnect.ConnectionString = connectionString
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand
            SQLcommand.CommandText = Select_anweisung

            Dim adapter1 As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(SQLcommand)
            Dim dt As DataTable = New DataTable()
            adapter1.Fill(dt)
            SQLconnect.Close()
            Return dt
        Catch ex As Exception
            MsgBox("Fehler bei Return_Datatable: " & ex.Message & vbNewLine & vbNewLine & Select_anweisung & vbNewLine & vbNewLine & "Call-Method: " & CallMethod, MsgBoxStyle.Critical)
            ClassLogger.Add("Fehler bei Return_Datatable: " & ex.Message & "Call-Method: " & CallMethod, True)
            If CallMethod <> "" Then ClassLogger.Add(">> Call-Method: " & CallMethod, False)
            ClassLogger.Add(">> SQL: " & Select_anweisung, False)
            Return Nothing
        End Try
    End Function
    Public Shared Function MSSQL_ReturnDTWithConnection(connectionId As Integer, sql As String)
        Try
            Dim connectionString As String
            connectionString = ClassDatabase.GetConnectionString(connectionId)
            If connectionString <> "" Then

                Dim SQLconnect As New SqlClient.SqlConnection
                Dim SQLcommand As SqlClient.SqlCommand
                SQLconnect.ConnectionString = connectionString
                SQLconnect.Open()
                SQLcommand = SQLconnect.CreateCommand
                SQLcommand.CommandText = sql

                Dim adapter1 As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(SQLcommand)
                Dim dt As DataTable = New DataTable()
                adapter1.Fill(dt)
                SQLconnect.Close()
                Return dt
            Else
                MsgBox("No ConnectionID!", MsgBoxStyle.Exclamation)
                Return Nothing
            End If

        Catch ex As Exception
            ClassLogger.Add(" - Unvorhergesehener Fehler bei MSSQL_ReturnDTWithConnection: " & vbNewLine & ex.Message)
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei MSSQL_ReturnDTWithConnection:")
            Return Nothing
        End Try
    End Function
    Public Shared Function Return_Datatable_CS(Select_anweisung As String, ConString As String, Optional userInput As Boolean = False)
        Try
            Dim SQLconnect As New SqlClient.SqlConnection
            Dim SQLcommand As SqlClient.SqlCommand
            SQLconnect.ConnectionString = ConString
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand
            SQLcommand.CommandText = Select_anweisung

            Dim adapter1 As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(SQLcommand)
            Dim dt As DataTable = New DataTable()
            adapter1.Fill(dt)
            SQLconnect.Close()
            Return dt
        Catch ex As Exception
            If userInput = True Then
                MsgBox("Error in Return_Datatable_CS - Error-Message:" & vbNewLine & ex.Message & vbNewLine & "SQL-Command:" & vbNewLine & Select_anweisung, MsgBoxStyle.Critical)
            End If
            ClassLogger.Add("Fehler bei Return_Datatable_CS: " & ex.Message, True)
            ClassLogger.Add("#SQL: " & Select_anweisung, False)
            Return Nothing
        End Try
    End Function
    Public Shared Function Execute_non_Query(ExecuteCMD As String, Optional Userinput As Boolean = False)
        Try
            Dim SQLconnect As New SqlClient.SqlConnection
            Dim SQLcommand As SqlClient.SqlCommand
            SQLconnect.ConnectionString = connectionString
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand
            'Update Last Created Record in Foo
            SQLcommand.CommandText = ExecuteCMD
           
            SQLcommand.ExecuteNonQuery()
            SQLcommand.Dispose()
            SQLconnect.Close()
            Return True
        Catch ex As Exception
            If Userinput = True Then
                MsgBox("Fehler bei Execute_non_Query: " & ex.Message & vbNewLine & vbNewLine & ExecuteCMD, MsgBoxStyle.Critical)

            End If
            ClassLogger.Add("Fehler bei Execute_non_Query: " & ex.Message, True)
            ClassLogger.Add("SQL: " & ExecuteCMD, False)
            Return False
        End Try
    End Function
    Public Shared Function Execute_non_Query_withConn(ExecuteCMD As String, ConnID As Integer)
        Try
            Dim connectionString As String
            connectionString = ClassDatabase.GetConnectionString(ConnID)
            If connectionString <> "" Then
                Dim SQLconnect As New SqlClient.SqlConnection
                Dim SQLcommand As SqlClient.SqlCommand
                SQLconnect.ConnectionString = connectionString
                SQLconnect.Open()
                SQLcommand = SQLconnect.CreateCommand
                'Update Last Created Record in Foo
                SQLcommand.CommandText = ExecuteCMD
                SQLcommand.ExecuteNonQuery()
                SQLcommand.Dispose()
                SQLconnect.Close()
                Return True
            Else
                MsgBox("No ConnectionID for Conn-ID: " & ConnID.ToString, MsgBoxStyle.Exclamation)
                Return Nothing
            End If
            
        Catch ex As Exception
            ClassLogger.Add("Fehler bei Execute_non_Query_withConn: " & ex.Message, True)
            ClassLogger.Add("SQL: " & ExecuteCMD, False)
            Return False
        End Try
    End Function

    'TODO: Asynchrone Abfrage möglich machen
    Public Shared Sub Execute_non_Query_Async(ExecuteCMD As String, Optional Userinput As Boolean = False)
        Dim SQLconnect As New SqlClient.SqlConnection
        Dim SQLcommand As SqlClient.SqlCommand
        Dim callback As New AsyncCallback(AddressOf Execute_non_Query_Async_Callback)

        Try
            SQLconnect.ConnectionString = connectionString
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand()
            'Update Last Created Record in Foo
            SQLcommand.CommandText = ExecuteCMD

            SQLcommand.BeginExecuteNonQuery(callback, SQLcommand)
        Catch ex As Exception
            If Userinput = True Then
                MsgBox("Fehler bei Execute_non_Query_Async: " & ex.Message & vbNewLine & vbNewLine & ExecuteCMD, MsgBoxStyle.Critical)
            End If
            ClassLogger.Add("Fehler bei Execute_non_Query_Async: " & ex.Message, True)
            ClassLogger.Add("SQL: " & ExecuteCMD, False)
        Finally
            SQLcommand.Dispose()
            SQLconnect.Close()
        End Try
    End Sub

    Private Shared Sub Execute_non_Query_Async_Callback(ByVal result As IAsyncResult)
        Dim command As SqlClient.SqlCommand = CType(result.AsyncState, SqlClient.SqlCommand)
        Dim res = command.EndExecuteNonQuery(result)

        ClassLogger.Add(String.Format("Finished executing Async database operation: {0}", command.CommandText), False)
    End Sub

    Public Shared Function Execute_Scalar(cmdscalar As String, Optional Userinput As Boolean = False)
        Dim result
        Try
            Dim SQLconnect As New SqlClient.SqlConnection
            Dim SQLcommand As SqlClient.SqlCommand
            SQLconnect.ConnectionString = connectionString
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand
            'Update Last Created Record in Foo
            SQLcommand.CommandText = cmdscalar
            result = SQLcommand.ExecuteScalar()
            SQLcommand.Dispose()
            SQLconnect.Close()
            Return result
        Catch ex As Exception
            If Userinput = True Then
                MsgBox("Fehler bei Execute_Scalar: " & ex.Message & vbNewLine & vbNewLine & cmdscalar, MsgBoxStyle.Critical)
            End If
            ClassLogger.Add("Fehler bei Execute_Scalar: " & ex.Message, True)
            ClassLogger.Add("SQL: " & cmdscalar, False)
            Return Nothing
        End Try
    End Function

    Public Shared Function Execute_ScalarWithConnection(connectionId As Integer, cmdscalar As String)
        Dim result
        Try
            Dim connectionString As String
            connectionString = ClassDatabase.GetConnectionString(connectionId)
            If connectionString <> "" Then
                Dim SQLconnect As New SqlClient.SqlConnection
                Dim SQLcommand As SqlClient.SqlCommand
                SQLconnect.ConnectionString = connectionString
                SQLconnect.Open()
                SQLcommand = SQLconnect.CreateCommand
                'Update Last Created Record in Foo
                SQLcommand.CommandText = cmdscalar
                result = SQLcommand.ExecuteScalar()
                SQLcommand.Dispose()
                SQLconnect.Close()
                Return result
            Else
                MsgBox("No ConnectionID!", MsgBoxStyle.Exclamation)
                Return Nothing
            End If

        Catch ex As Exception
            ClassLogger.Add("Fehler bei Execute_ScalarWithConnection: " & ex.Message, True)
            ClassLogger.Add("SQL: " & cmdscalar, False)
            Return Nothing
        End Try
    End Function

    Public Shared Function OracleExecute_Scalar(cmdscalar As String, OracleConnection As String)
        Dim result
        Try
            Dim SQLconnect As New OracleConnection
            Dim SQLcommand As New OracleCommand
            SQLconnect.ConnectionString = OracleConnection
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand
            'Update Last Created Record in Foo
            SQLcommand.CommandText = cmdscalar
            result = SQLcommand.ExecuteScalar()
            SQLcommand.Dispose()
            SQLconnect.Close()
            Return result
        Catch ex As Exception
            ClassLogger.Add("Fehler bei OracleExecute_Scalar: " & ex.Message, True)
            ClassLogger.Add("#SQL: " & cmdscalar, False)
            Return Nothing
        End Try
    End Function
    Public Shared Function OracleExecute_non_Query(ExecuteCMD As String, OracleConnection As String, Optional userInput As Boolean = False)
        Try
            Dim SQLconnect As New OracleConnection
            Dim SQLcommand As OracleCommand
            SQLconnect.ConnectionString = OracleConnection
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand
            'Update Last Created Record in Foo
            SQLcommand.CommandText = ExecuteCMD
            SQLcommand.ExecuteNonQuery()
            SQLcommand.Dispose()
            SQLconnect.Close()
            Return True
        Catch ex As Exception
            If userInput = True Then
                MsgBox("Error in OracleExecute_non_Query - Error-Message:" & vbNewLine & ex.Message & vbNewLine & "SQL-Command:" & vbNewLine & ExecuteCMD, MsgBoxStyle.Critical)
            End If
            ClassLogger.Add("Fehler bei OracleExecute_non_Query: " & ex.Message, True)
            ClassLogger.Add("#SQL: " & ExecuteCMD, False)

            Return False
        End Try
    End Function

    Public Shared Function Oracle_Return_Datatable(Select_anweisung As String, OracleConnection As String, Optional userInput As Boolean = False)
        Try
            Dim SQLconnect As New OracleConnection
            Dim SQLcommand As OracleCommand
            SQLconnect.ConnectionString = OracleConnection
            SQLconnect.Open()
            SQLcommand = SQLconnect.CreateCommand
            SQLcommand.CommandText = Select_anweisung

            Dim adapter1 As OracleDataAdapter = New OracleDataAdapter(SQLcommand)
            Dim dt As DataTable = New DataTable()
            adapter1.Fill(dt)
            SQLconnect.Close()
            Return dt
        Catch ex As Exception
            If userInput = True Then
                MsgBox("Error in Oracle Return Datatable - Error-Message:" & vbNewLine & ex.Message & vbNewLine & "SQL-Command:" & vbNewLine & Select_anweisung, MsgBoxStyle.Critical)
            End If
            ClassLogger.Add("Fehler bei Oracle_Return_Datatable: " & ex.Message, True)
            ClassLogger.Add("#SQL: " & Select_anweisung, False)
            Return Nothing
        End Try
    End Function
End Class
