- Neues Projekt `EDMI.API` zur Solution hinzugefügt. - `App.config`: Abhängigkeiten und `bindingRedirect` aktualisiert. - Verbesserte Thread-Sicherheit mit `ReaderWriterLockSlim`. - SQL-Abfragen mit `WITH (NOLOCK)` für bessere Parallelität. - Robuste Verarbeitung von `DataRow`-Werten mit `IIf(IsDBNull(...))`. - Neue Sicherheitsprüfung für `JobListener` initialisiert. - `SaveDataTables` optimiert, Performance-Warnungen hinzugefügt. - Versionsnummer auf `2.5.0.0` aktualisiert, Copyright auf 2026. - Paket `NLog` aus `packages.config` entfernt.
73 lines
3.2 KiB
VB.net
73 lines
3.2 KiB
VB.net
Imports DigitalData.Modules.Database
|
|
Imports DigitalData.Modules.Language
|
|
Imports DigitalData.Modules.Logging
|
|
|
|
Namespace Methods.Database.GetDatatableFromCache
|
|
Public Class GetDatatableFromCacheMethod
|
|
Inherits BaseMethod
|
|
|
|
Public Sub New(pLogConfig As LogConfig, pDatabaseIDB As MSSQLServer, pDatabaseECM As MSSQLServer, pGlobalState As GlobalState)
|
|
MyBase.New(pLogConfig, pDatabaseIDB, pDatabaseECM, pGlobalState)
|
|
End Sub
|
|
|
|
Public Function Run(pData As GetDatatableFromCacheRequest) As GetDatatableFromCacheResponse
|
|
Try
|
|
Logger.Debug($"ReturnDatatableFromCache: Datatable: {pData.DataTable}")
|
|
|
|
' ✅ NEU: Sicherheitsprüfung (sollte nie auftreten, aber defensiv)
|
|
If GlobalState.JobListener Is Nothing Then
|
|
Logger.Warn("JobListener not initialized - this should not happen! Using direct TableStore access.")
|
|
|
|
' Fallback: Direkter Zugriff auf TableStore
|
|
If Not GlobalState.TableStore.Tables.Contains(pData.DataTable) Then
|
|
Return New GetDatatableFromCacheResponse(
|
|
New KeyNotFoundException($"Datatable {pData.DataTable} does not exist"))
|
|
End If
|
|
|
|
Dim oDirectTable = GlobalState.TableStore.Tables(pData.DataTable).Copy()
|
|
' ... Filter/Sort anwenden wie gehabt
|
|
Return New GetDatatableFromCacheResponse(ApplyFilterAndSort(oDirectTable, pData))
|
|
End If
|
|
|
|
' ✅ Normal: Thread-sicheren Zugriff verwenden
|
|
Dim oDataTable As DataTable = GlobalState.JobListener.GetTableSafely(pData.DataTable)
|
|
|
|
If oDataTable Is Nothing Then
|
|
Logger.Warn($"Datatable {pData.DataTable} does not exist")
|
|
Return New GetDatatableFromCacheResponse(
|
|
New KeyNotFoundException($"Datatable {pData.DataTable} does not exist"))
|
|
End If
|
|
|
|
Return New GetDatatableFromCacheResponse(ApplyFilterAndSort(oDataTable, pData))
|
|
|
|
|
|
Catch ex As Exception
|
|
Logger.Error(ex)
|
|
Return New GetDatatableFromCacheResponse(ex)
|
|
|
|
End Try
|
|
End Function
|
|
' ✅ Hilfsmethode zum Filter/Sort anwenden
|
|
Private Function ApplyFilterAndSort(table As DataTable, request As GetDatatableFromCacheRequest) As DataTable
|
|
Dim oFilterExpression = IIf(IsDBNull(request.FilterExpression), String.Empty, request.FilterExpression)
|
|
Dim oSortByColumn = IIf(IsDBNull(request.SortByColumn), String.Empty, request.SortByColumn)
|
|
|
|
Logger.Debug("Filter: [{0}], Sort: [{1}]", oFilterExpression, oSortByColumn)
|
|
|
|
Dim oFilteredRows = table.Select(oFilterExpression, oSortByColumn)
|
|
Dim oResult As DataTable
|
|
|
|
If oFilteredRows.Count > 0 Then
|
|
oResult = oFilteredRows.CopyToDataTable()
|
|
Else
|
|
oResult = table.Clone()
|
|
End If
|
|
|
|
oResult.TableName = request.DataTable
|
|
Logger.Debug("Rows: {0} → {1}", table.Rows.Count, oResult.Rows.Count)
|
|
|
|
Return oResult
|
|
End Function
|
|
End Class
|
|
|
|
End Namespace |