Files
Monorepo/Service.EDMIService/Methods/Database/GetDatatableFromCache/GetDatatableFromCacheMethod.vb
Developer01 0f9e7c55ec Neue Features, Optimierungen und Bugfixes
- 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.
2026-08-28 12:19:34 +02:00

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