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.
This commit is contained in:
Developer01
2026-08-28 12:19:34 +02:00
parent 9d5e022562
commit 0f9e7c55ec
15 changed files with 292 additions and 175 deletions

View File

@@ -14,49 +14,60 @@ Namespace Methods.Database.GetDatatableFromCache
Try
Logger.Debug($"ReturnDatatableFromCache: Datatable: {pData.DataTable}")
Dim oDataTable As DataTable = Nothing
' ✅ 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.")
Logger.Debug("ReturnDatatableFromCache: DataSet contains [{0}] datatables", GlobalState.TableStore.Tables.Count)
If GlobalState.TableStore.Tables.Contains(pData.DataTable) Then
oDataTable = GlobalState.TableStore.Tables.Item(pData.DataTable).Copy()
' Apply filter and sorting to data
Dim oFilterExpression As String = Utils.NotNull(pData.FilterExpression, String.Empty)
Dim oSortByColumn As String = Utils.NotNull(pData.SortByColumn, String.Empty)
Logger.Debug("Applying filter expression: [{0}]", oFilterExpression)
Logger.Debug("Applying sort expression: [{0}]", oSortByColumn)
Dim oFilteredRows = oDataTable.Select(oFilterExpression, oSortByColumn)
Dim oFilteredTable As DataTable = Nothing
If oFilteredRows.Count > 0 Then
oFilteredTable = oFilteredRows.CopyToDataTable()
oFilteredTable.TableName = pData.DataTable
Else
' Produce empty table
oFilteredTable = oDataTable.Clone()
oFilteredTable.TableName = pData.DataTable
' 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
Logger.Debug("ReturnDatatableFromCache: Datatable Stats for [{0}]:", pData.DataTable)
Logger.Debug("Unfiltered: [{0}] rows", oDataTable.Rows.Count)
Logger.Debug("Filtered: [{0}] rows", oFilteredTable.Rows.Count)
Return New GetDatatableFromCacheResponse(oFilteredTable)
Else
Logger.Warn($"ReturnDatatableFromCache: Datatable {pData.DataTable} does not exist")
Return New GetDatatableFromCacheResponse(New KeyNotFoundException($"Datatable {pData.DataTable} does not exist"))
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