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