Files
ToolCollection/ToolCollection/ClassNIDatenbankzugriff.vb
2026-07-02 17:35:04 +02:00

655 lines
26 KiB
VB.net

Imports System.Data.SqlClient
Imports System.Data.Odbc
Imports System.Data.OleDb
Imports Oracle.ManagedDataAccess.Client
Imports System.Timers
Imports System.Threading
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Database
Imports System.IO
Public Class ClassNIDatenbankzugriff
Private Shared _Logger As DigitalData.Modules.Logging.Logger
Private Shared _LastStep, _SQL As String
Private Shared aTimerCount As Integer = 0
Private Shared aTimer As System.Timers.Timer
Private _firebird As Firebird
Sub New(LogConf As DigitalData.Modules.Logging.LogConfig)
_Logger = LogConf.GetLogger()
If My.Settings.FB_DATASOURCE <> String.Empty Then
_firebird = New Firebird(LogConf, My.Settings.FB_DATASOURCE, My.Settings.FB_DATABASE, My.Settings.FB_USER, My.Settings.FB_PW)
End If
'Data Source=SDD-VMP04-SQL17\DD_DEVELOP01;Initial Catalog=DD_ECM_TEST;Persist Security Info=True;User ID=sa;Password=dd
End Sub
Shared Sub Timer_Stop()
aTimer.Enabled = False
aTimerCount = 0
End Sub
' Überprüft den Indexwert und gibt 0 oder mehr zurück
Public Function CheckIndex_mssql(Profilname As String, ByVal scalarselect As String, ByVal datasource As String, ByVal User As String, ByVal pw As String, ByVal myDS As DataSet, ByVal init_Cata As String)
Try
Dim Connection As SqlConnection = Nothing
Dim Command As SqlCommand = Nothing
Dim DataAdapter As SqlDataAdapter = Nothing
Dim DataSetSQL As DataSet = Nothing
Dim con As String
' ConnectionString aufbauen
If User = "WINAUTH" Then
con = "Data Source=" & datasource & ";Initial Catalog=" & init_Cata & ";Trusted_Connection=True;"
Else
con = "Server=" & datasource & ";Database=" & init_Cata & ";User Id=" & User & ";Password=" & pw & ";"
End If
' Verbindung zur Datenbank aufbauen
Try
Connection = New SqlConnection(con)
Connection.Open()
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseMssqlDb(Connection)
Return Nothing
End Try
' SQL-Abfrage definieren
Command.CommandText = scalarselect
Command.Connection = Connection
Dim ergebnis As String = Command.ExecuteScalar.ToString
Return CLng(ergebnis)
Catch ex As Exception
' an dieser Stelle sollte jeder unvorhergesehene Fehler der Funktion abgefangen werden
_Logger.Error(ex)
Return 0
End Try
End Function
Private Sub CloseMssqlDb(ByRef Connection As SqlConnection)
' wenn eine Datenbank-Connection aufgebaut ist
If Connection IsNot Nothing Then
' diese schliessen
Connection.Close()
Connection = Nothing
End If
End Sub
' führt eine SQL-Anweisung auf der DB aus
Public Function GetValueFromMssqlDb(WMFilename As String, Profilname As String, ByVal selectAnweisung As String, ByVal datasource As String, ByVal User As String, ByVal pw As String, ByVal myDS As DataSet, ByVal init_Cata As String, Optional ByVal Indexname As String = "", Optional ByVal QuellVektor As Boolean = False) '
Try
_Logger.Debug("MS-SQL: " & selectAnweisung)
' die nötigen Variablen definieren
'####
Dim con As String
' ConnectionString aufbauen
If User = "WINAUTH" Then
con = "Data Source=" & datasource & ";Initial Catalog=" & init_Cata & ";Trusted_Connection=True;"
Else
con = "Server=" & datasource & ";Database=" & init_Cata & ";User Id=" & User & ";Password=" & pw & ";"
End If
Dim SQLconnect As New SqlClient.SqlConnection
Dim SQLcommand As SqlClient.SqlCommand
SQLconnect.ConnectionString = con
Try
SQLconnect.Open()
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Return Nothing
End Try
' SQL-Abfrage definieren
Try
SQLcommand = SQLconnect.CreateCommand
SQLcommand.CommandText = selectAnweisung
SQLcommand.CommandTimeout = 120
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
SQLconnect.Close()
Return Nothing
End Try
'Den Datenadapter laden und die Datatable zurückgeben
Try
If Not IsNothing(SQLcommand) Then
Dim adapter1 As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(SQLcommand)
Dim dt As DataTable = New DataTable()
adapter1.Fill(dt)
If Not IsNothing(dt) Then
Try
Select Case dt.Rows.Count
Case 0
_Logger.Debug($"{WMFilename} # SQL liefert keine Zeile zurück: [{selectAnweisung}]")
If QuellVektor = True Then
SQLconnect.Close()
Return "Empty Row"
Else
SQLconnect.Close()
Return ""
End If
Case 1
' einen einzigen relevanten Wert zurückgeben
Dim sqlresult = dt.Rows(0).Item(0)
If IsDBNull(sqlresult) Then
_Logger.Debug($"{WMFilename} # Genau 1 Zeile allerdings System.DBNull - [{selectAnweisung}]")
If QuellVektor = True Then
SQLconnect.Close()
Return "NULL Row"
Else
SQLconnect.Close()
Return ""
End If
Else
_Logger.Debug($"{WMFilename} # Genau 1 Zeile - SQL-Ergebnis: '" & sqlresult.ToString & "'")
Dim newRow As DataRow
If QuellVektor = True Then
newRow = myDS.Tables("TBVEKTOR_ARRAY").NewRow()
'filling the row with values. Item property is used to set the field value.
newRow.Item("IndexName") = Indexname
newRow.Item("Value") = CStr(sqlresult)
_Logger.Debug("Value: " & CStr(sqlresult))
myDS.Tables("TBVEKTOR_ARRAY").Rows.Add(newRow)
Else
newRow = myDS.Tables("TBVEKTOR_ARRAY").NewRow()
'filling the row with values. Item property is used to set the field value.
newRow.Item("IndexName") = Indexname
newRow.Item("Value") = sqlresult.ToString
myDS.Tables("TBVEKTOR_ARRAY").Rows.Add(newRow)
End If
If sqlresult Is Nothing Then
SQLconnect.Close()
Return 1
Else
SQLconnect.Close()
Return sqlresult
End If
End If
Case Else
'SQL liefert mehrere Werte zurück
_Logger.Debug($"{WMFilename} # Mehrere Zeilen durch SQL - Anzahl: " & dt.Rows.Count)
'Beginne mit 0
Dim counter As Integer = 0
For Each Row As DataRow In dt.Rows
Dim newRow As DataRow
newRow = myDS.Tables("TBVEKTOR_ARRAY").NewRow()
'filling the row with values. Item property is used to set the field value.
newRow.Item("IndexName") = Indexname
newRow.Item("Value") = CStr(Row.Item(0))
_Logger.Debug("Value: " & CStr(Row.Item(0)))
myDS.Tables("TBVEKTOR_ARRAY").Rows.Add(newRow)
' ds.Tables("TBVEKTOR_ARRAYDataTable").Rows.Add(Temptable.Rows(0))
counter += 1
Next
SQLconnect.Close()
Return counter
End Select
SQLconnect.Close()
Catch ex As Exception
_Logger.Warn("ClassNIDatenbankzugriff.GetValueFromMssqlDb" & ex.Message)
' DB-Connection schliessen
SQLconnect.Close()
Return Nothing
End Try
Else
'Eintrag in Logdatei machen
_Logger.Warn("Die Datatable ist unerwartet nothing. (SQL: " & selectAnweisung & ")")
SQLconnect.Close()
Return Nothing
End If
Else
'kann eintreten, wenn entweder die SQL-Anweisung falsch ist oder wenn die DataConnection nicht richtig aufgebaut werden konnte
'Eintrag in Logdatei machen
_Logger.Warn("SQL-Anweisung ist ungültig. Command-Objekt konnte nicht erstellt werden. (SQL: " & selectAnweisung & ")")
SQLconnect.Close()
Return Nothing
End If
Catch ex As Exception
' bei einem Fehler einen Eintrag in der Logdatei erzeugen
_Logger.Error(ex)
_Logger.Warn($"SQL-Command [{selectAnweisung}]")
' DB-Connection schliessen
SQLconnect.Close()
Return Nothing
End Try
SQLconnect.Close()
'#####
Catch ex As Exception
' an dieser Stelle sollte jeder unvorhergesehene Fehler der Funktion abgefangen werden
_Logger.Error(ex)
Return Nothing
End Try
End Function
Public Function GetValueFromFirebird(Profilname As String, ByVal selectAnweisung As String, ByVal Indexname As String, myDS As DataSet) '
Try
_Logger.Debug("Firebird: " & selectAnweisung)
Dim result = _firebird.GetScalarValue(selectAnweisung)
Dim newRow As DataRow
newRow = myDS.Tables("TBVEKTOR_ARRAY").NewRow()
'filling the row with values. Item property is used to set the field value.
newRow.Item("IndexName") = Indexname
newRow.Item("Value") = CStr(result)
_Logger.Debug("Value: " & CStr(result))
myDS.Tables("TBVEKTOR_ARRAY").Rows.Add(newRow)
Return result
'#####
Catch ex As Exception
' an dieser Stelle sollte jeder unvorhergesehene Fehler der Funktion abgefangen werden
_Logger.Error(ex)
_Logger.Warn("selectAnweisung: " & selectAnweisung)
Return Nothing
End Try
End Function
' führt eine SQL-Anweisung auf der DB aus
Public Function ExecuteonMSSQL(Profilname As String, ByVal sqlcommand As String, ByVal datasource As String, ByVal User As String, ByVal pw As String, ByVal init_Cata As String)
Try
_Logger.Debug("MSSQL-Command: " & sqlcommand)
' die nötigen Variablen definieren
Dim Connection As SqlConnection = Nothing
' Dim ConnectionString As SqlConnectionStringBuilder = Nothing
Dim oSQLCommand As SqlCommand = Nothing
Dim DataAdapter As SqlDataAdapter = Nothing
'' ConnectionString aufbauen (aus Settings auslesen)
'ConnectionString = New SqlConnectionStringBuilder()
'ConnectionString.DataSource = datasource
'ConnectionString.UserID = User
'ConnectionString.Password = pw
'ConnectionString.InitialCatalog = init_Cata
Dim con As String
' ConnectionString aufbauen
If User = "WINAUTH" Then
con = "Data Source=" & datasource & ";Initial Catalog=" & init_Cata & ";Trusted_Connection=True;"
Else
con = "Server=" & datasource & ";Database=" & init_Cata & ";User Id=" & User & ";Password=" & pw & ";"
End If
' Verbindung zur Datenbank aufbauen
Try
Connection = New SqlConnection(con)
Connection.Open()
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseMssqlDb(Connection)
Return 0
End Try
' SQL-Abfrage definieren
Try
oSQLCommand = New SqlCommand(sqlcommand, Connection)
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseMssqlDb(Connection)
Return 0
End Try
' *** Ausführen des Command ***
If oSQLCommand IsNot Nothing Then
Try
oSQLCommand.ExecuteNonQuery()
' DB-Connection schliessen
Me.CloseMssqlDb(Connection)
Return 1
Catch ex As Exception
' bei einem Fehler einen Eintrag in der Logdatei erzeugen
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseMssqlDb(Connection)
Return 0
End Try
Else
' kann eintreten, wenn entweder die SQL-Anweisung falsch ist oder wenn die DataConnection nicht richtig aufgebaut werden konnte
' Eintrag in Logdatei machen
_Logger.Warn("Unexpected error in Execute on MSSQL Row 774")
Return 0
End If
Catch ex As Exception
' an dieser Stelle sollte jeder unvorhergesehene Fehler der Funktion abgefangen werden
_Logger.Error(ex)
Return 0
End Try
End Function
Public Function CheckIndex_MSSSQL(Profilname As String, ByVal scalar_select As String, ByVal datasource As String, ByVal User As String, ByVal pw As String, ByVal init_Cata As String)
Try
_Logger.Debug("MSSQL-Command: " & scalar_select)
' die nötigen Variablen definieren
Dim Connection As SqlConnection = Nothing
Dim Command As SqlCommand = Nothing
Dim con As String
' ConnectionString aufbauen
If User = "WINAUTH" Then
con = "Data Source=" & datasource & ";Initial Catalog=" & init_Cata & ";Trusted_Connection=True;"
Else
con = "Server=" & datasource & ";Database=" & init_Cata & ";User Id=" & User & ";Password=" & pw & ";"
End If
' Verbindung zur Datenbank aufbauen
Try
Connection = New SqlConnection(con)
Connection.Open()
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseMssqlDb(Connection)
Return Nothing
End Try
' SQL-Abfrage definieren
Try
Command = New SqlCommand(scalar_select, Connection)
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseMssqlDb(Connection)
Return Nothing
End Try
Dim ergebnis = Command.ExecuteScalar
Return CLng(ergebnis)
Catch ex As Exception
' an dieser Stelle sollte jeder unvorhergesehene Fehler der Funktion abgefangen werden
_Logger.Error(ex)
Return 0
End Try
End Function
Public Function CheckIndex_ODBC(Profilname As String, ByVal scalar_select As String, ByVal datasource As String, ByVal User As String, ByVal pw As String)
Try
_Logger.Debug("SQL-Command: " & scalar_select)
' die nötigen Variablen definieren
Dim Connection As OdbcConnection = Nothing
Dim Command As OdbcCommand = Nothing
Dim con As String
' ConnectionString aufbauen
con = $"DSN={datasource};UID={User};Pwd={pw};"
' Verbindung zur Datenbank aufbauen
Try
Connection = New OdbcConnection(con)
Connection.Open()
Catch ex As Exception
_Logger.Error(ex)
Connection.Close()
Return Nothing
End Try
' SQL-Abfrage definieren
Try
Command = New OdbcCommand(scalar_select, Connection)
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Connection.Close()
Return Nothing
End Try
Dim ergebnis = Command.ExecuteScalar
Return CLng(ergebnis)
Catch ex As Exception
' an dieser Stelle sollte jeder unvorhergesehene Fehler der Funktion abgefangen werden
_Logger.Error(ex)
Return 0
End Try
End Function
Public Sub CloseOdbcDb(ByRef Connection As OdbcConnection)
' wenn eine Datenbank-Connection aufgebaut ist
If Connection IsNot Nothing Then
' diese schliessen
Connection.Close()
Connection = Nothing
End If
End Sub
' führt eine SQL-Anweisung auf der DB aus
Public Function GetValueFromOdbcDb(Profilname As String, ByVal selectAnweisung As String, ByVal datasource As String, ByVal User As String, ByVal pw As String, Optional ByVal Indexname As String = "") '
Try
_Logger.Debug("ODBC: " & selectAnweisung)
' die nötigen Variablen definieren
Dim result As Object = Nothing
Dim Connection As OdbcConnection = Nothing
Dim ConnectionString As OdbcConnectionStringBuilder = Nothing
Dim Command As OdbcCommand = Nothing
Dim DataAdapter As OdbcDataAdapter = Nothing
Dim DataSet As DataSet = Nothing
' ConnectionString aufbauen (aus Settings auslesen)
ConnectionString = New OdbcConnectionStringBuilder()
ConnectionString.ConnectionString = "Dsn=" & datasource & ";Uid=" & User & ";Pwd=" & pw
' Verbindung zur Datenbank aufbauen
Try
Connection = New OdbcConnection(ConnectionString.ConnectionString)
Connection.Open()
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseOdbcDb(Connection)
Return Nothing
End Try
' SQL-Abfrage definieren
Try
Command = New OdbcCommand(selectAnweisung, Connection)
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseOdbcDb(Connection)
Return Nothing
End Try
' *** ÜBER EINEN DATAREADER ***
'Dim DataReader As OracleDataReader = Command.ExecuteReader()
'Do While DataReader.Read
' For c As Integer = 0 To DataReader.FieldCount - 1
' result = DataReader.GetValue(c)
' Return result
' Next
'Loop
' *** ÜBER EIN DATASET ***
If Command IsNot Nothing Then
Try
' Datenadapter laden
DataAdapter = New OdbcDataAdapter(Command)
' DataSet erzeugen
DataSet = New DataSet()
' DataSet mit Daten füllen
DataAdapter.Fill(DataSet)
' DB-Connection schliessen
Me.CloseOdbcDb(Connection)
' einen einzigen relevanten Wert zurückgeben (sollten keine mehrfachen Einträge auftauchen)
Return DataSet.Tables(0).Rows(0).Item(0)
Catch ex As Exception
' bei einem Fehler einen Eintrag in der Logdatei erzeugen
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseOdbcDb(Connection)
Return Nothing
End Try
Else
' kann eintreten, wenn entweder die SQL-Anweisung falsch ist oder wenn die DataConnection nicht richtig aufgebaut werden konnte
' Eintrag in Logdatei machen
_Logger.Warn("Unexpected Error in GetValueFromODBC Row 3937")
Return Nothing
End If
Catch ex As Exception
' an dieser Stelle sollte jeder unvorhergesehene Fehler der Funktion abgefangen werden
_Logger.Error(ex)
Return Nothing
End Try
End Function
Private Sub CloseOleDb(ByRef Connection As OleDbConnection)
' wenn eine Datenbank-Connection aufgebaut ist
If Connection IsNot Nothing Then
' diese schliessen
Connection.Close()
Connection = Nothing
End If
End Sub
' führt eine SQL-Anweisung auf der DB aus
Public Function GetValueFromOleDb(Profilname As String, ByVal selectAnweisung As String, ByVal datasource As String, ByVal User As String, ByVal pw As String, Optional ByVal Indexname As String = "") '
_Logger.Debug("OLEDB: " & selectAnweisung)
'MsgBox(selectAnweisung)
Try
' die nötigen Variablen definieren
Dim result As Object = Nothing
Dim Connection As OleDbConnection = Nothing
Dim ConnectionString As OleDbConnectionStringBuilder = New System.Data.OleDb.OleDbConnectionStringBuilder
Dim Command As OleDbCommand = Nothing
Dim DataAdapter As OleDbDataAdapter = Nothing
Dim DataSet As DataSet = Nothing
'Console.WriteLine(selectAnweisung)
' ConnectionString aufbauen (aus Settings auslesen)
ConnectionString("Provider") = "Microsoft.Jet.OLEDB.4.0"
ConnectionString("Data Source") = datasource
ConnectionString("User Id") = User
ConnectionString("Password") = pw
'ConnectionString = New OleDbConnectionStringBuilder()
'ConnectionString.ConnectionString = "Dsn=" & datasource & ";Uid=" & User & ";Pwd=" & pw
'ConnectionString.DataSource = datasource
'ConnectionString.Provider =
' Verbindung zur Datenbank aufbauen
Try
Connection = New OleDbConnection(ConnectionString.ConnectionString)
Connection.Open()
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseOleDb(Connection)
Return Nothing
End Try
' SQL-Abfrage definieren
Try
Command = New OleDbCommand(selectAnweisung, Connection)
Catch ex As Exception
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseOleDb(Connection)
Return Nothing
End Try
' *** ÜBER EINEN DATAREADER ***
'Dim DataReader As OracleDataReader = Command.ExecuteReader()
'Do While DataReader.Read
' For c As Integer = 0 To DataReader.FieldCount - 1
' result = DataReader.GetValue(c)
' Return result
' Next
'Loop
' *** ÜBER EIN DATASET ***
If Command IsNot Nothing Then
Try
' Datenadapter laden
DataAdapter = New OleDbDataAdapter(Command)
' DataSet erzeugen
DataSet = New DataSet()
' DataSet mit Daten füllen
DataAdapter.Fill(DataSet)
' DB-Connection schliessen
Me.CloseOleDb(Connection)
' Console.WriteLine(DataSet.Tables(0).Rows(0).Item(0))
' einen einzigen relevanten Wert zurückgeben (sollten keine mehrfachen Einträge auftauchen)
Return DataSet.Tables(0).Rows(0).Item(0)
Catch ex As Exception
' bei einem Fehler einen Eintrag in der Logdatei erzeugen
_Logger.Error(ex)
' DB-Connection schliessen
Me.CloseOleDb(Connection)
Return Nothing
End Try
Else
' kann eintreten, wenn entweder die SQL-Anweisung falsch ist oder wenn die DataConnection nicht richtig aufgebaut werden konnte
' Eintrag in Logdatei machen
_Logger.Warn("Unexpected Error in GetValueFromODBC Row 1057")
Return Nothing
End If
Catch ex As Exception
_Logger.Error(ex)
Return Nothing
End Try
End Function
End Class