diff --git a/EDMIAPI/Client.vb b/EDMIAPI/Client.vb
index f16d2664..cccbdfc0 100644
--- a/EDMIAPI/Client.vb
+++ b/EDMIAPI/Client.vb
@@ -22,8 +22,45 @@ Public Class Client
' Runtime Variables
Private _ServerAddress As ServerAddressStruct
Private _ClientConfig As GlobalStateClientConfiguration
+
+ Private ReadOnly _CachedTablesLock As New ReaderWriterLockSlim()
Private _CachedTables As New List(Of String)
- Private _IsOnline As Boolean
+
+ Public ReadOnly Property CachedTables As List(Of String)
+ Get
+ _CachedTablesLock.EnterReadLock()
+ Try
+ Return _CachedTables.ToList() ' Snapshot zurückgeben
+ Finally
+ _CachedTablesLock.ExitReadLock()
+ End Try
+ End Get
+ End Property
+
+ ' Hilfsmethode – intern für alle Schreibzugriffe verwenden
+ Private Sub SetCachedTables(pTables As IEnumerable(Of String))
+ _CachedTablesLock.EnterWriteLock()
+ Try
+ _CachedTables = pTables.ToList()
+ Finally
+ _CachedTablesLock.ExitWriteLock()
+ End Try
+ End Sub
+ ' Ersetzt: Private _IsOnline As Boolean
+ Private _IsOnline As Integer = 0 ' 0 = offline, 1 = online (Interlocked-kompatibel)
+ Public ReadOnly Property IsOnline As Boolean
+ Get
+ Return Interlocked.CompareExchange(_IsOnline, 0, 0) = 1
+ End Get
+ End Property
+ ' Setter-Hilfsmethoden für alle Schreibstellen:
+ Private Sub SetOnline()
+ Interlocked.Exchange(_IsOnline, 1)
+ End Sub
+
+ Private Sub SetOffline()
+ Interlocked.Exchange(_IsOnline, 0)
+ End Sub
' Verhindert parallele Reconnect-Versuche (0 = frei, 1 = läuft)
Private _IsReconnecting As Integer = 0
Private _Channel As IEDMIServiceChannel
@@ -56,14 +93,14 @@ Public Class Client
Protected Overridable Sub Dispose(disposing As Boolean)
If _Disposed Then Return
If disposing Then
- _IsOnline = False ' ← Reconnect-Guard deaktivieren
+ SetOffline()
UpdateTimer.Stop()
UpdateTimer.Dispose()
' Auf laufenden Reconnect warten
Dim oTimeout = DateTime.Now.AddSeconds(5)
While _IsReconnecting = 1 AndAlso DateTime.Now < oTimeout
- Task.Delay(100).Wait()
+ Thread.Sleep(100)
End While
If _Channel IsNot Nothing Then
@@ -71,6 +108,8 @@ Public Class Client
_Channel = Nothing
End If
+ _CachedTablesLock.Dispose() ' ← NEU: Lock freigeben
+
Dim oRemoved As ClientStatus = Nothing
_ActiveClients.TryRemove(_ClientId, oRemoved)
Logger.Debug("Client [{0}] unregistered. Total active clients: [{1}]", _ClientName, _ActiveClients.Count)
@@ -79,11 +118,6 @@ Public Class Client
End Sub
' Public Variables
- Public ReadOnly Property CachedTables
- Get
- Return _CachedTables
- End Get
- End Property
Public ReadOnly Property ClientConfig As GlobalStateClientConfiguration
Get
@@ -94,13 +128,6 @@ Public Class Client
Return _ClientConfig
End Get
End Property
-
- Public ReadOnly Property IsOnline As Boolean
- Get
- Return _IsOnline
- End Get
- End Property
-
Public ReadOnly Property ServerAddress As String
Get
Return $"{_ServerAddress.Host}:{_ServerAddress.Port}"
@@ -197,14 +224,14 @@ Public Class Client
' CachedTables sofort befüllen – nicht auf den ersten Timer-Tick warten
Try
Dim oTables As String() = _Channel.GetCachedTables()
- _CachedTables = oTables.Select(Function(t) t.ToUpper).ToList()
- Logger.Debug("✔ CachedTables loaded on connect: [{0}]", _CachedTables.Count)
+ SetCachedTables(oTables.Select(Function(t) t.ToUpper()))
+ Logger.Debug("✔ CachedTables loaded on connect: [{0}]", CachedTables.Count)
Catch ex As Exception
Logger.Warn("⚠ CachedTables could not be loaded on connect: {0}", ex.Message)
- _CachedTables = New List(Of String)
+ SetCachedTables(Enumerable.Empty(Of String)())
End Try
- _IsOnline = True ' ← vor GetStatus()
+ SetOnline()
UpdateTimer.Start()
' In Registry eintragen – jetzt mit korrektem IsOnline=True
@@ -213,7 +240,7 @@ Public Class Client
Return True
Catch ex As Exception
- _IsOnline = False
+ SetOffline()
Logger.Error(ex)
Return False
End Try
@@ -243,7 +270,7 @@ Public Class Client
_Channel = ChannelManager.GetChannel()
_Channel.Open()
- _IsOnline = True
+ SetOnline()
If _ActiveClients.ContainsKey(_ClientId) Then
_ActiveClients(_ClientId) = GetStatus()
@@ -253,7 +280,7 @@ Public Class Client
Return
Catch ex As Exception
Logger.Warn("⚠ Reconnect failed after [{0}]s: {1}", oDelay, ex.Message)
- _IsOnline = False
+ SetOffline()
End Try
Next
@@ -266,53 +293,51 @@ Public Class Client
Private Async Sub UpdateTimer_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles UpdateTimer.Elapsed
Try
- If _Channel Is Nothing OrElse _Channel.State <> CommunicationState.Opened Then
- Logger.Warn("⚠ UpdateTimer skipped: Channel not in Opened state [{0}]", If(_Channel IsNot Nothing, _Channel.State.ToString(), "null"))
- _IsOnline = False
+ ' ← Snapshot VOR dem Await – schützt gegen _Channel = Nothing nach Resume
+ Dim oChannel = _Channel
+ If oChannel Is Nothing OrElse oChannel.State <> CommunicationState.Opened Then
+ Logger.Warn("⚠ UpdateTimer skipped: Channel not in Opened state [{0}]",
+ If(oChannel IsNot Nothing, oChannel.State.ToString(), "null"))
+ SetOffline()
Reconnect(sender, e)
Return
End If
- If Not _IsOnline Then
+ If Not IsOnline Then
Logger.Debug("UpdateTimer skipped: Client is offline.")
Return
End If
- Dim oTables As String() = Await _Channel.GetCachedTablesAsync()
- ' ◄ NullReferenceException-Schutz: Service kann Nothing zurückgeben
+ Dim oTables As String() = Await oChannel.GetCachedTablesAsync() ' ← oChannel statt _Channel
+
If oTables Is Nothing Then
Logger.Warn("⚠ UpdateTimer: GetCachedTablesAsync returned Nothing.")
- _CachedTables = New List(Of String)
+ SetCachedTables(Enumerable.Empty(Of String)())
Return
End If
- _CachedTables = oTables.
- Select(Function(table) table.ToUpper).
- ToList()
+ SetCachedTables(oTables.Select(Function(table) table.ToUpper()))
+
+ ' ← oChannel.State statt _Channel.State
Logger.Info("✔ Channel state: [{0}] | Active connections: [{1}] | CachedTables: [{2}]",
- _Channel.State,
- Channel.ActiveConnections,
- _CachedTables.Count)
+ oChannel.State, Channel.ActiveConnections, CachedTables.Count)
If _ActiveClients.ContainsKey(_ClientId) Then
_ActiveClients(_ClientId) = GetStatus()
End If
Catch ex As TimeoutException
- ' Stale TCP connection (z.B. Firewall/Citrix Idle-Timeout)
- Logger.Warn("⚠ UpdateTimer: TCP connection lost (idle timeout / firewall). Triggering reconnect...")
- _IsOnline = False
+ Logger.Warn("⚠ UpdateTimer: TCP connection lost. Triggering reconnect...")
+ SetOffline()
Reconnect()
-
Catch ex As CommunicationException
Logger.Warn("⚠ UpdateTimer: Channel faulted. Triggering reconnect...")
- _IsOnline = False
+ SetOffline()
Reconnect()
-
Catch ex As Exception
Logger.Warn("⚠ Update of CachedTable was not successful!")
Logger.Error(ex)
- _CachedTables = New List(Of String)
+ SetCachedTables(Enumerable.Empty(Of String)())
End Try
End Sub
@@ -626,6 +651,59 @@ Public Class Client
End Function
#Region "GetDatatable"
+ Public Function GetDatatableByName(DatatableName As String, Optional FilterExpression As String = "", Optional SortByColumn As String = "") As TableResult
+ EnsureAvailable()
+ Try
+ Return _Channel.ReturnDatatableFromCache(DatatableName, FilterExpression, SortByColumn)
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetDatatableByName))
+ Catch ex As EndpointNotFoundException
+ HandleCommunicationError(ex, NameOf(GetDatatableByName))
+ Catch ex As CommunicationException
+ HandleCommunicationError(ex, NameOf(GetDatatableByName))
+ Catch ex As Exception
+ Logger.Error(ex)
+ Throw
+ End Try
+ End Function
+
+ Public Function GetScalarValueFromIDB(pSQL As String) As GetScalarValueResponse
+ EnsureAvailable()
+ Try
+ Return _Channel.ReturnScalarValue(New GetScalarValueRequest() With {
+ .SqlCommand = pSQL,
+ .NamedDatabase = DatabaseName.IDB
+ })
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetScalarValueFromIDB))
+ Catch ex As EndpointNotFoundException
+ HandleCommunicationError(ex, NameOf(GetScalarValueFromIDB))
+ Catch ex As CommunicationException
+ HandleCommunicationError(ex, NameOf(GetScalarValueFromIDB))
+ Catch ex As Exception
+ Logger.Error(ex)
+ Throw
+ End Try
+ End Function
+
+ Public Function ExecuteNonQueryFromIDB(pSQL As String) As ExecuteNonQueryResponse
+ EnsureAvailable()
+ Try
+ Return _Channel.ExecuteNonQuery(New ExecuteNonQueryRequest() With {
+ .SqlCommand = pSQL,
+ .NamedDatabase = DatabaseName.IDB
+ })
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromIDB))
+ Catch ex As EndpointNotFoundException
+ HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromIDB))
+ Catch ex As CommunicationException
+ HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromIDB))
+ Catch ex As Exception
+ Logger.Error(ex)
+ Throw
+ End Try
+ End Function
Public Function GetDatatableFromIDB(pSQL As String) As GetDatatableResponse
EnsureAvailable()
Try
@@ -633,6 +711,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.IDB
})
+ Catch ex As TimeoutException ' ← NEU
+ HandleCommunicationError(ex, NameOf(GetDatatableFromIDB))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetDatatableFromIDB))
Catch ex As CommunicationException
@@ -643,6 +723,7 @@ Public Class Client
End Try
End Function
+ ' ── GetDatatable ──────────────────────────────────────────
Public Function GetDatatableFromECM(pSQL As String) As GetDatatableResponse
EnsureAvailable()
Try
@@ -650,6 +731,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.ECM
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetDatatableFromECM))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetDatatableFromECM))
Catch ex As CommunicationException
@@ -668,6 +751,8 @@ Public Class Client
.NamedDatabase = DatabaseName.None,
.ConnectionId = pConnectionId
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetDatatableFromConnection))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetDatatableFromConnection))
Catch ex As CommunicationException
@@ -685,6 +770,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.IDB
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetDatatableFromIDBAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetDatatableFromIDBAsync))
Catch ex As CommunicationException
@@ -703,6 +790,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.ECM
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetDatatableFromECMAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetDatatableFromECMAsync))
Catch ex As CommunicationException
@@ -721,6 +810,8 @@ Public Class Client
.NamedDatabase = DatabaseName.None,
.ConnectionId = pConnectionId
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetDatatableFromConnectionAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetDatatableFromConnectionAsync))
Catch ex As CommunicationException
@@ -730,26 +821,8 @@ Public Class Client
Throw
End Try
End Function
-#End Region
-
-#Region "GetScalarValue"
- Public Function GetScalarValueFromIDB(pSQL As String) As GetScalarValueResponse
- EnsureAvailable()
- Try
- Return _Channel.ReturnScalarValue(New GetScalarValueRequest() With {
- .SqlCommand = pSQL,
- .NamedDatabase = DatabaseName.IDB
- })
- Catch ex As EndpointNotFoundException
- HandleCommunicationError(ex, NameOf(GetScalarValueFromIDB))
- Catch ex As CommunicationException
- HandleCommunicationError(ex, NameOf(GetScalarValueFromIDB))
- Catch ex As Exception
- Logger.Error(ex)
- Throw
- End Try
- End Function
+ ' ── GetScalarValue ─────────────────────────────────────────
Public Function GetScalarValueFromECM(pSQL As String) As GetScalarValueResponse
EnsureAvailable()
Try
@@ -757,6 +830,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.ECM
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetScalarValueFromECM))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetScalarValueFromECM))
Catch ex As CommunicationException
@@ -775,6 +850,8 @@ Public Class Client
.NamedDatabase = DatabaseName.None,
.ConnectionId = pConnectionId
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetScalarValueFromConnection))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetScalarValueFromConnection))
Catch ex As CommunicationException
@@ -792,6 +869,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.IDB
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetScalarValueFromIDBAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetScalarValueFromIDBAsync))
Catch ex As CommunicationException
@@ -809,6 +888,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.ECM
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetScalarValueFromECMAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetScalarValueFromECMAsync))
Catch ex As CommunicationException
@@ -827,6 +908,8 @@ Public Class Client
.NamedDatabase = DatabaseName.None,
.ConnectionId = pConnectionId
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetScalarValueFromConnectionAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(GetScalarValueFromConnectionAsync))
Catch ex As CommunicationException
@@ -836,26 +919,8 @@ Public Class Client
Throw
End Try
End Function
-#End Region
-
-#Region "ExecuteNonQuery"
- Public Function ExecuteNonQueryFromIDB(pSQL As String) As ExecuteNonQueryResponse
- EnsureAvailable()
- Try
- Return _Channel.ExecuteNonQuery(New ExecuteNonQueryRequest() With {
- .SqlCommand = pSQL,
- .NamedDatabase = DatabaseName.IDB
- })
- Catch ex As EndpointNotFoundException
- HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromIDB))
- Catch ex As CommunicationException
- HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromIDB))
- Catch ex As Exception
- Logger.Error(ex)
- Throw
- End Try
- End Function
+ ' ── ExecuteNonQuery ────────────────────────────────────────
Public Function ExecuteNonQueryFromECM(pSQL As String) As ExecuteNonQueryResponse
EnsureAvailable()
Try
@@ -863,6 +928,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.ECM
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromECM))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromECM))
Catch ex As CommunicationException
@@ -881,6 +948,8 @@ Public Class Client
.NamedDatabase = DatabaseName.None,
.ConnectionId = pConnectionId
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromConnection))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromConnection))
Catch ex As CommunicationException
@@ -898,6 +967,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.IDB
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromIDBAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromIDBAsync))
Catch ex As CommunicationException
@@ -915,6 +986,8 @@ Public Class Client
.SqlCommand = pSQL,
.NamedDatabase = DatabaseName.ECM
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromECMAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromECMAsync))
Catch ex As CommunicationException
@@ -933,6 +1006,8 @@ Public Class Client
.NamedDatabase = DatabaseName.None,
.ConnectionId = pConnectionId
})
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromConnectionAsync))
Catch ex As EndpointNotFoundException
HandleCommunicationError(ex, NameOf(ExecuteNonQueryFromConnectionAsync))
Catch ex As CommunicationException
@@ -942,45 +1017,26 @@ Public Class Client
Throw
End Try
End Function
+
+ ' ── Sonstige ───────────────────────────────────────────────
+ Public Async Function GetDatatableByNameAsync(DatatableName As String, Optional FilterExpression As String = "", Optional SortByColumn As String = "") As Task(Of TableResult)
+ EnsureAvailable()
+ Try
+ Return Await _Channel.ReturnDatatableFromCacheAsync(DatatableName, FilterExpression, SortByColumn)
+ Catch ex As TimeoutException
+ HandleCommunicationError(ex, NameOf(GetDatatableByNameAsync))
+ Catch ex As EndpointNotFoundException
+ HandleCommunicationError(ex, NameOf(GetDatatableByNameAsync))
+ Catch ex As CommunicationException
+ HandleCommunicationError(ex, NameOf(GetDatatableByNameAsync))
+ Catch ex As Exception
+ Logger.Error(ex)
+ Throw
+ End Try
+ End Function
#End Region
- Public Function GetDatatableByName(DatatableName As String, Optional FilterExpression As String = "", Optional SortByColumn As String = "") As TableResult
- EnsureAvailable()
- Try
- Return _Channel.ReturnDatatableFromCache(DatatableName, FilterExpression, SortByColumn)
- Catch ex As EndpointNotFoundException
- HandleCommunicationError(ex, NameOf(GetDatatableByName))
- Catch ex As CommunicationException
- HandleCommunicationError(ex, NameOf(GetDatatableByName))
- Catch ex As Exception
- Logger.Error(ex)
- Throw
- End Try
- End Function
-
- Public Async Function GetDatatableByNameAsync(DatatableName As String, Optional FilterExpression As String = "", Optional SortByColumn As String = "") As Task(Of TableResult)
- EnsureAvailable()
- Try
- Return Await _Channel.ReturnDatatableFromCacheAsync(DatatableName, FilterExpression, SortByColumn)
- Catch ex As EndpointNotFoundException
- HandleCommunicationError(ex, NameOf(GetDatatableByNameAsync))
- Catch ex As CommunicationException
- HandleCommunicationError(ex, NameOf(GetDatatableByNameAsync))
- Catch ex As Exception
- Logger.Error(ex)
- Throw
- End Try
- End Function
-
-
-
- '''
- ''' Return infos about a file object
- '''
- '''
- '''
- '''
Public Function GetDocumentInfo(UserId As Long, ObjectId As Long) As DocumentInfo
Try
Dim oResponse As DocumentInfoResponse = _Channel.GetFileInfoByObjectId(New DocumentInfoRequest With {
@@ -1056,27 +1112,25 @@ Public Class Client
Throw New InvalidOperationException("Channel is not initialized. Call Connect() first.")
End If
- If Not _IsOnline Then
- ' Kurze Grace-Period abwarten, damit Reconnect() seinen _IsReconnecting-Flag setzen kann
- Dim oGraceLimit = DateTime.Now.AddMilliseconds(600)
- While DateTime.Now < oGraceLimit AndAlso _IsReconnecting = 0 AndAlso Not _IsOnline
- Task.Delay(100).Wait()
- End While
+ If Not IsOnline Then
+ ' Wenn Reconnect aktiv läuft: kurze Grace-Period (max 1s) statt 10s
+ If _IsReconnecting = 1 Then
+ Dim oGraceLimit = DateTime.Now.AddMilliseconds(1000)
+ While DateTime.Now < oGraceLimit AndAlso Not IsOnline
+ Thread.Sleep(100)
+ End While
+ End If
- ' Jetzt auf aktiven Reconnect warten
- Dim oWaitLimit = DateTime.Now.AddSeconds(10)
- While Not _IsOnline AndAlso DateTime.Now < oWaitLimit AndAlso _IsReconnecting = 1
- Task.Delay(500).Wait()
- Logger.Debug("EnsureAvailable: Waiting for reconnect... Channel=[{0}]", _Channel.State.ToString())
- End While
-
- If Not _IsOnline Then
- Throw New InvalidOperationException("Client is offline.")
+ ' Danach sofort werfen – WCF-Timeout nicht weiter aufbrauchen
+ If Not IsOnline Then
+ Throw New InvalidOperationException(
+ $"Client is offline. Reconnect in progress=[{_IsReconnecting = 1}].")
End If
End If
If _Channel.State <> CommunicationState.Opened Then
- Throw New InvalidOperationException($"Channel is not available. State=[{_Channel.State}]")
+ Throw New InvalidOperationException(
+ $"Channel is not available. State=[{_Channel.State}]")
End If
End Sub
'''
@@ -1084,6 +1138,8 @@ Public Class Client
'''
Private Sub HandleCommunicationError(ex As Exception, callerName As String)
Select Case True
+ Case TypeOf ex Is TimeoutException
+ Logger.Warn("⚠ TimeoutException in [{0}]. Channel may be stale. Triggering reconnect...", callerName)
Case TypeOf ex Is EndpointNotFoundException
Logger.Warn("⚠ Service not reachable (EndpointNotFoundException in [{0}]). Triggering reconnect...", callerName)
Case TypeOf ex Is CommunicationException
@@ -1093,7 +1149,7 @@ Public Class Client
Logger.Error(ex)
End Select
- _IsOnline = False
+ SetOffline()
Reconnect()
Throw ex
End Sub
@@ -1190,15 +1246,16 @@ Public Class Client
''' Returns a detailed status snapshot of the current client state
'''
Public Function GetStatus() As ClientStatus
+ Dim oTables = CachedTables ' ← Property nutzen: enthält Read-Lock + Snapshot
Return New ClientStatus() With {
- .IsOnline = _IsOnline,
- .ClientId = _ClientId, ' ← Neu
+ .IsOnline = IsOnline, ' ← Property statt Feld
+ .ClientId = _ClientId,
.ClientName = _ClientName,
.ServerAddress = Me.ServerAddress,
.ChannelState = If(_Channel IsNot Nothing, _Channel.State.ToString(), "null"),
.ActiveConnections = Channel.ActiveConnections,
- .CachedTableCount = _CachedTables.Count,
- .CachedTables = _CachedTables.ToList(),
+ .CachedTableCount = oTables.Count, ' ← aus Snapshot
+ .CachedTables = oTables, ' ← aus Snapshot
.HasClientConfig = _ClientConfig IsNot Nothing,
.IsDisposed = _Disposed,
.TimerEnabled = UpdateTimer.Enabled,
diff --git a/EDMIAPI/Client/Channel.vb b/EDMIAPI/Client/Channel.vb
index 53f75c26..8d7eceb3 100644
--- a/EDMIAPI/Client/Channel.vb
+++ b/EDMIAPI/Client/Channel.vb
@@ -8,10 +8,14 @@ Imports DigitalData.Modules.Logging
Public Class Channel
Inherits BaseClass
+ Private Shared ReadOnly _FactoryLock As New Object()
+ Private Shared _SharedFactory As ChannelFactory(Of IEDMIServiceChannel) = Nothing
+ Private Shared _SharedFactoryEndpoint As String = String.Empty
+
Private ReadOnly ChannelFactory As ChannelFactory(Of IEDMIServiceChannel)
Public Event Reconnect As EventHandler
- ' Verbindungszähler
+
Private Shared _ActiveConnections As Integer = 0
Public Shared ReadOnly Property ActiveConnections As Integer
Get
@@ -20,40 +24,91 @@ Public Class Channel
End Property
Public Shared Function GetBinding(Optional AuthenticationMode As TcpClientCredentialType = TcpClientCredentialType.Windows) As NetTcpBinding
+ Dim oMaxConnections = Math.Max(500, Environment.ProcessorCount * 50)
+
Return New NetTcpBinding() With {
- .MaxReceivedMessageSize = Constants.ChannelSettings.MAX_RECEIVED_MESSAGE_SIZE,
- .MaxBufferSize = Constants.ChannelSettings.MAX_BUFFER_SIZE,
- .MaxBufferPoolSize = Constants.ChannelSettings.MAX_BUFFER_POOL_SIZE,
- .ListenBacklog = Constants.ChannelSettings.MAX_CONNECTIONS,
- .MaxConnections = Constants.ChannelSettings.MAX_CONNECTIONS,
- .TransferMode = TransferMode.Streamed,
- .SendTimeout = TimeSpan.FromSeconds(30), ' ← War: 5min → Schnellere Fehlererkennung
- .ReceiveTimeout = TimeSpan.FromMinutes(10), ' Keepalive < Firewall-Timeout (3600s) ✓
- .OpenTimeout = TimeSpan.FromSeconds(30), ' ← Neu: Verbindungsaufbau begrenzen
- .CloseTimeout = TimeSpan.FromSeconds(30),
- .Security = New NetTcpSecurity() With {
- .Mode = SecurityMode.Transport,
- .Transport = New TcpTransportSecurity() With {
- .ClientCredentialType = AuthenticationMode
+ .MaxReceivedMessageSize = Constants.ChannelSettings.MAX_RECEIVED_MESSAGE_SIZE,
+ .MaxBufferSize = Constants.ChannelSettings.MAX_BUFFER_SIZE,
+ .MaxBufferPoolSize = Constants.ChannelSettings.MAX_BUFFER_POOL_SIZE,
+ .ListenBacklog = oMaxConnections,
+ .MaxConnections = oMaxConnections,
+ .TransferMode = TransferMode.Streamed,
+ .SendTimeout = TimeSpan.FromSeconds(60),
+ .ReceiveTimeout = TimeSpan.FromMinutes(10),
+ .OpenTimeout = TimeSpan.FromSeconds(60),
+ .CloseTimeout = TimeSpan.FromSeconds(30),
+ .Security = New NetTcpSecurity() With {
+ .Mode = SecurityMode.Transport,
+ .Transport = New TcpTransportSecurity() With {
+ .ClientCredentialType = AuthenticationMode
+ }
+ },
+ .ReaderQuotas = New XmlDictionaryReaderQuotas() With {
+ .MaxArrayLength = Constants.ChannelSettings.MAX_ARRAY_LENGTH,
+ .MaxStringContentLength = Constants.ChannelSettings.MAX_STRING_CONTENT_LENGTH
}
- },
- .ReaderQuotas = New XmlDictionaryReaderQuotas() With {
- .MaxArrayLength = Constants.ChannelSettings.MAX_ARRAY_LENGTH,
- .MaxStringContentLength = Constants.ChannelSettings.MAX_STRING_CONTENT_LENGTH
}
- }
End Function
Public Sub New(pLogConfig As LogConfig, pServerAddress As ServerAddressStruct)
MyBase.New(pLogConfig)
- ChannelFactory = GetChannelFactory(pServerAddress)
+ ChannelFactory = GetOrCreateSharedFactory(pLogConfig, pServerAddress)
End Sub
+
+ '''
+ ''' Gibt eine gemeinsame ChannelFactory zurück.
+ ''' Ein Connection-Pool für alle Client-Instanzen desselben Endpoints.
+ '''
+ Private Shared Function GetOrCreateSharedFactory(pLogConfig As LogConfig, pServerAddress As ServerAddressStruct) As ChannelFactory(Of IEDMIServiceChannel)
+ Dim oEndpoint = $"net.tcp://{pServerAddress.Host}:{pServerAddress.Port}/DigitalData/Services/Main"
+
+ ' ← Volatile.Read: garantiert aktuellen Wert auch ohne Lock
+ Dim oCurrentFactory = Volatile.Read(_SharedFactory)
+ If oCurrentFactory IsNot Nothing AndAlso
+ _SharedFactoryEndpoint = oEndpoint AndAlso
+ (oCurrentFactory.State = CommunicationState.Opened OrElse
+ oCurrentFactory.State = CommunicationState.Created) Then
+ Return oCurrentFactory
+ End If
+
+ SyncLock _FactoryLock
+ ' Double-check nach Lock
+ If _SharedFactory IsNot Nothing AndAlso
+ _SharedFactoryEndpoint = oEndpoint AndAlso
+ (_SharedFactory.State = CommunicationState.Opened OrElse
+ _SharedFactory.State = CommunicationState.Created) Then
+ Return _SharedFactory
+ End If
+
+ If _SharedFactory IsNot Nothing Then
+ If _SharedFactory.State = CommunicationState.Faulted OrElse
+ _SharedFactory.State = CommunicationState.Closing Then
+ Try
+ _SharedFactory.Abort()
+ Catch
+ End Try
+ End If
+ _SharedFactory = Nothing
+ End If
+
+ Dim oLogger = pLogConfig.GetLogger()
+ Dim oBinding = GetBinding()
+ Dim oAddress = New EndpointAddress(oEndpoint)
+
+ oLogger.Debug("Creating shared ChannelFactory | Endpoint=[{0}] | MaxConnections=[{1}] | SendTimeout=[{2}] | OpenTimeout=[{3}]",
+ oEndpoint, oBinding.MaxConnections, oBinding.SendTimeout, oBinding.OpenTimeout)
+
+ _SharedFactory = New ChannelFactory(Of IEDMIServiceChannel)(oBinding, oAddress)
+ _SharedFactoryEndpoint = oEndpoint
+ Return _SharedFactory
+ End SyncLock
+ End Function
+
'''
''' Closes a channel gracefully, falls back to Abort on error
'''
Public Shared Sub CloseChannel(pChannel As IEDMIServiceChannel)
If pChannel Is Nothing Then Return
-
Try
If pChannel.State = CommunicationState.Opened Then
pChannel.Close()
@@ -61,31 +116,27 @@ Public Class Channel
pChannel.State = CommunicationState.Closing Then
pChannel.Abort()
End If
- ' CommunicationState.Created / Closed → nichts tun, Zähler nicht betroffen
Catch ex As Exception
Try
pChannel.Abort()
Catch
- ' Ignore
End Try
End Try
End Sub
+
'''
''' Creates a channel and adds a Faulted-Handler
'''
- ''' A channel object
Public Function GetChannel() As IEDMIServiceChannel
Try
- Logger.Debug("Creating channel.")
+ Logger.Debug("Creating channel from shared factory.")
Dim oChannel = ChannelFactory.CreateChannel()
- ' Verbindung zählen beim Öffnen
AddHandler oChannel.Opened, Sub()
Dim oCount = Interlocked.Increment(_ActiveConnections)
Logger.Debug("Channel opened. Active connections: [{0}]", oCount)
End Sub
- ' Verbindung abziehen beim Schließen oder Fehler
AddHandler oChannel.Closed, Sub()
Dim oCount = Interlocked.Decrement(_ActiveConnections)
Logger.Debug("Channel closed. Active connections: [{0}]", oCount)
@@ -93,7 +144,7 @@ Public Class Channel
AddHandler oChannel.Faulted, Sub()
Dim oCount = Interlocked.Decrement(_ActiveConnections)
- Logger.Warn("Channel faulted. Active connections: [{0}]", oCount)
+ Logger.Warn("⚠ Channel faulted. Active connections: [{0}]", oCount)
RaiseEvent Reconnect(Me, Nothing)
End Sub
@@ -104,20 +155,4 @@ Public Class Channel
Throw
End Try
End Function
-
- Private Function GetChannelFactory(pServerAddress As ServerAddressStruct) As ChannelFactory(Of IEDMIServiceChannel)
- Dim oBinding = GetBinding()
- Dim oAddress = New EndpointAddress($"net.tcp://{pServerAddress.Host}:{pServerAddress.Port}/DigitalData/Services/Main")
- Logger.Debug("Creating ChannelFactory with Binding: SendTimeout=[{0}], ReceiveTimeout=[{1}], MaxConnections=[{2}], MaxBufferSize=[{3}], TransferMode=[{4}]",
- oBinding.SendTimeout,
- oBinding.ReceiveTimeout,
- oBinding.MaxConnections,
- oBinding.MaxBufferSize,
- oBinding.TransferMode)
- Dim oFactory = New ChannelFactory(Of IEDMIServiceChannel)(oBinding, oAddress)
- Return oFactory
- End Function
-
-End Class
-
-
+End Class
\ No newline at end of file
diff --git a/EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap b/EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap
index bc5505c0..1ad6b3b6 100644
--- a/EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap
+++ b/EDMIAPI/Connected Services/EDMIServiceReference/Reference.svcmap
@@ -1,5 +1,5 @@
-
+
false
true
diff --git a/EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb b/EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb
index 2aaa8bbb..0e2c9cb4 100644
--- a/EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb
+++ b/EDMIAPI/Connected Services/EDMIServiceReference/Reference.vb
@@ -15,94 +15,94 @@ Imports System
Imports System.Runtime.Serialization
Namespace EDMIServiceReference
-
-
+
+ _
Partial Public Class BaseResponse
Inherits Object
Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
-
-
+
+ _
Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
-
-
+
+ _
Private ErrorDetailsField As String
-
-
+
+ _
Private ErrorMessageField As String
-
-
+
+ _
Private OKField As Boolean
-
-
+
+ _
Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
Get
Return Me.extensionDataField
End Get
Set
- Me.extensionDataField = Value
+ Me.extensionDataField = value
End Set
End Property
-
-
+
+ _
Public Property ErrorDetails() As String
Get
Return Me.ErrorDetailsField
End Get
Set
- If (Object.ReferenceEquals(Me.ErrorDetailsField, Value) <> True) Then
- Me.ErrorDetailsField = Value
+ If (Object.ReferenceEquals(Me.ErrorDetailsField, value) <> true) Then
+ Me.ErrorDetailsField = value
Me.RaisePropertyChanged("ErrorDetails")
End If
End Set
End Property
-
-
+
+ _
Public Property ErrorMessage() As String
Get
Return Me.ErrorMessageField
End Get
Set
- If (Object.ReferenceEquals(Me.ErrorMessageField, Value) <> True) Then
- Me.ErrorMessageField = Value
+ If (Object.ReferenceEquals(Me.ErrorMessageField, value) <> true) Then
+ Me.ErrorMessageField = value
Me.RaisePropertyChanged("ErrorMessage")
End If
End Set
End Property
-
-
+
+ _
Public Property OK() As Boolean
Get
Return Me.OKField
End Get
Set
- If (Me.OKField.Equals(Value) <> True) Then
- Me.OKField = Value
+ If (Me.OKField.Equals(value) <> true) Then
+ Me.OKField = value
Me.RaisePropertyChanged("OK")
End If
End Set
End Property
-
+
Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
-
+
Protected Sub RaisePropertyChanged(ByVal propertyName As String)
Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent
If (Not (propertyChanged) Is Nothing) Then
@@ -110,492 +110,492 @@ Namespace EDMIServiceReference
End If
End Sub
End Class
-
-
+
+ _
Partial Public Class TableResult
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private TableField As System.Data.DataTable
-
-
+
+ _
Public Property Table() As System.Data.DataTable
Get
Return Me.TableField
End Get
Set
- If (Object.ReferenceEquals(Me.TableField, Value) <> True) Then
- Me.TableField = Value
+ If (Object.ReferenceEquals(Me.TableField, value) <> true) Then
+ Me.TableField = value
Me.RaisePropertyChanged("Table")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class ScalarResult
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ScalarField As Object
-
-
+
+ _
Public Property Scalar() As Object
Get
Return Me.ScalarField
End Get
Set
- If (Object.ReferenceEquals(Me.ScalarField, Value) <> True) Then
- Me.ScalarField = Value
+ If (Object.ReferenceEquals(Me.ScalarField, value) <> true) Then
+ Me.ScalarField = value
Me.RaisePropertyChanged("Scalar")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class NonQueryResult
Inherits EDMIServiceReference.BaseResponse
End Class
-
-
+
+ _
Partial Public Class GetDatatableResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private TableField As System.Data.DataTable
-
-
+
+ _
Public Property Table() As System.Data.DataTable
Get
Return Me.TableField
End Get
Set
- If (Object.ReferenceEquals(Me.TableField, Value) <> True) Then
- Me.TableField = Value
+ If (Object.ReferenceEquals(Me.TableField, value) <> true) Then
+ Me.TableField = value
Me.RaisePropertyChanged("Table")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class GetScalarValueResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ScalarField As Object
-
-
+
+ _
Public Property Scalar() As Object
Get
Return Me.ScalarField
End Get
Set
- If (Object.ReferenceEquals(Me.ScalarField, Value) <> True) Then
- Me.ScalarField = Value
+ If (Object.ReferenceEquals(Me.ScalarField, value) <> true) Then
+ Me.ScalarField = value
Me.RaisePropertyChanged("Scalar")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class ExecuteNonQueryResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ResultField As Boolean
-
-
+
+ _
Public Property Result() As Boolean
Get
Return Me.ResultField
End Get
Set
- If (Me.ResultField.Equals(Value) <> True) Then
- Me.ResultField = Value
+ If (Me.ResultField.Equals(value) <> true) Then
+ Me.ResultField = value
Me.RaisePropertyChanged("Result")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class NewFileResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ObjectIdField As Long
-
-
+
+ _
Public Property ObjectId() As Long
Get
Return Me.ObjectIdField
End Get
Set
- If (Me.ObjectIdField.Equals(Value) <> True) Then
- Me.ObjectIdField = Value
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
Me.RaisePropertyChanged("ObjectId")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class UpdateFileResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ObjectIdField As Long
-
-
+
+ _
Public Property ObjectId() As Long
Get
Return Me.ObjectIdField
End Get
Set
- If (Me.ObjectIdField.Equals(Value) <> True) Then
- Me.ObjectIdField = Value
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
Me.RaisePropertyChanged("ObjectId")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class SetAttributeValueResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ObjectIdField As Long
-
-
+
+ _
Public Property ObjectId() As Long
Get
Return Me.ObjectIdField
End Get
Set
- If (Me.ObjectIdField.Equals(Value) <> True) Then
- Me.ObjectIdField = Value
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
Me.RaisePropertyChanged("ObjectId")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class GetAttributeValueResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ObjectIdField As Long
-
-
+
+ _
Private ValueField As Object
-
-
+
+ _
Public Property ObjectId() As Long
Get
Return Me.ObjectIdField
End Get
Set
- If (Me.ObjectIdField.Equals(Value) <> True) Then
- Me.ObjectIdField = Value
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
Me.RaisePropertyChanged("ObjectId")
End If
End Set
End Property
-
-
+
+ _
Public Property Value() As Object
Get
Return Me.ValueField
End Get
Set
- If (Object.ReferenceEquals(Me.ValueField, Value) <> True) Then
- Me.ValueField = Value
+ If (Object.ReferenceEquals(Me.ValueField, value) <> true) Then
+ Me.ValueField = value
Me.RaisePropertyChanged("Value")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class GetFileObjectResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private FileObjectField As EDMIServiceReference.FileObject
-
-
+
+ _
Public Property FileObject() As EDMIServiceReference.FileObject
Get
Return Me.FileObjectField
End Get
Set
- If (Object.ReferenceEquals(Me.FileObjectField, Value) <> True) Then
- Me.FileObjectField = Value
+ If (Object.ReferenceEquals(Me.FileObjectField, value) <> true) Then
+ Me.FileObjectField = value
Me.RaisePropertyChanged("FileObject")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class CheckInOutFileResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ObjectIdField As Long
-
-
+
+ _
Public Property ObjectId() As Long
Get
Return Me.ObjectIdField
End Get
Set
- If (Me.ObjectIdField.Equals(Value) <> True) Then
- Me.ObjectIdField = Value
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
Me.RaisePropertyChanged("ObjectId")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class ImportFileResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ObjectIdField As Long
-
-
+
+ _
Public Property ObjectId() As Long
Get
Return Me.ObjectIdField
End Get
Set
- If (Me.ObjectIdField.Equals(Value) <> True) Then
- Me.ObjectIdField = Value
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
Me.RaisePropertyChanged("ObjectId")
End If
End Set
End Property
End Class
-
-
+
+ _
Partial Public Class Globix_ImportFileResponse
Inherits EDMIServiceReference.BaseResponse
-
-
+
+ _
Private ObjectIdField As Long
-
-
+
+ _
Public Property ObjectId() As Long
Get
Return Me.ObjectIdField
End Get
Set
- If (Me.ObjectIdField.Equals(Value) <> True) Then
- Me.ObjectIdField = Value
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
Me.RaisePropertyChanged("ObjectId")
End If
End Set
@@ -628,7 +628,7 @@ Namespace EDMIServiceReference
End Class
Partial Public Class ServiceStatusResponse
Inherits Object
@@ -636,18 +636,26 @@ Namespace EDMIServiceReference
Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
-
Private ActiveSessionCountField As Integer
-
Private ActiveUsersField As System.Collections.Generic.List(Of String)
-
Private ActiveSessionsField As System.Collections.Generic.Dictionary(Of String, String)
-
Private TimestampField As Date
+
+ Private RecentUsersField As System.Collections.Generic.List(Of String)
+
+ Private LastJobDurationMsField As Long
+
+ Private LastJobNameField As String
+
+ Private LastJobTimestampField As Date
+
+ Private SlowQueryCountField As Integer
+
+ Private CachedTablesSnapshotAgeField As Integer
Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
@@ -711,6 +719,83 @@ Namespace EDMIServiceReference
End Set
End Property
+
+ Public Property RecentUsers() As System.Collections.Generic.List(Of String)
+ Get
+ Return Me.RecentUsersField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.RecentUsersField, Value) <> True) Then
+ Me.RecentUsersField = Value
+ Me.RaisePropertyChanged("RecentUsers")
+ End If
+ End Set
+ End Property
+
+ Public Property LastJobDurationMs() As Long
+ Get
+ Return Me.LastJobDurationMsField
+ End Get
+ Set
+ If (Me.LastJobDurationMsField.Equals(Value) <> True) Then
+ Me.LastJobDurationMsField = Value
+ Me.RaisePropertyChanged("LastJobDurationMs")
+ End If
+ End Set
+ End Property
+
+
+ Public Property LastJobName() As String
+ Get
+ Return Me.LastJobNameField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.LastJobNameField, Value) <> True) Then
+ Me.LastJobNameField = Value
+ Me.RaisePropertyChanged("LastJobName")
+ End If
+ End Set
+ End Property
+
+
+ Public Property LastJobTimestamp() As Date
+ Get
+ Return Me.LastJobTimestampField
+ End Get
+ Set
+ If (Me.LastJobTimestampField.Equals(Value) <> True) Then
+ Me.LastJobTimestampField = Value
+ Me.RaisePropertyChanged("LastJobTimestamp")
+ End If
+ End Set
+ End Property
+
+
+ Public Property SlowQueryCount() As Integer
+ Get
+ Return Me.SlowQueryCountField
+ End Get
+ Set
+ If (Me.SlowQueryCountField.Equals(Value) <> True) Then
+ Me.SlowQueryCountField = Value
+ Me.RaisePropertyChanged("SlowQueryCount")
+ End If
+ End Set
+ End Property
+
+
+ Public Property CachedTablesSnapshotAge() As Integer
+ Get
+ Return Me.CachedTablesSnapshotAgeField
+ End Get
+ Set
+ If (Me.CachedTablesSnapshotAgeField.Equals(Value) <> True) Then
+ Me.CachedTablesSnapshotAgeField = Value
+ Me.RaisePropertyChanged("CachedTablesSnapshotAge")
+ End If
+ End Set
+ End Property
+
Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Protected Sub RaisePropertyChanged(ByVal propertyName As String)
@@ -3256,248 +3341,248 @@ Namespace EDMIServiceReference
Public Function ReturnDatatableFromCache(ByVal Name As String, ByVal FilterExpression As String, ByVal SortByColumn As String) As EDMIServiceReference.TableResult Implements EDMIServiceReference.IEDMIService.ReturnDatatableFromCache
Return MyBase.Channel.ReturnDatatableFromCache(Name, FilterExpression, SortByColumn)
End Function
-
+
Public Function ReturnDatatableFromCacheAsync(ByVal Name As String, ByVal FilterExpression As String, ByVal SortByColumn As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) Implements EDMIServiceReference.IEDMIService.ReturnDatatableFromCacheAsync
Return MyBase.Channel.ReturnDatatableFromCacheAsync(Name, FilterExpression, SortByColumn)
End Function
-
+
Public Function ReturnDatatable(ByVal pData As EDMIServiceReference.GetDatatableRequest) As EDMIServiceReference.GetDatatableResponse Implements EDMIServiceReference.IEDMIService.ReturnDatatable
Return MyBase.Channel.ReturnDatatable(pData)
End Function
-
+
Public Function ReturnDatatableAsync(ByVal pData As EDMIServiceReference.GetDatatableRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.GetDatatableResponse) Implements EDMIServiceReference.IEDMIService.ReturnDatatableAsync
Return MyBase.Channel.ReturnDatatableAsync(pData)
End Function
-
+
Public Function ReturnScalarValue(ByVal pData As EDMIServiceReference.GetScalarValueRequest) As EDMIServiceReference.GetScalarValueResponse Implements EDMIServiceReference.IEDMIService.ReturnScalarValue
Return MyBase.Channel.ReturnScalarValue(pData)
End Function
-
+
Public Function ReturnScalarValueAsync(ByVal pData As EDMIServiceReference.GetScalarValueRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.GetScalarValueResponse) Implements EDMIServiceReference.IEDMIService.ReturnScalarValueAsync
Return MyBase.Channel.ReturnScalarValueAsync(pData)
End Function
-
+
Public Function ExecuteNonQuery(ByVal pData As EDMIServiceReference.ExecuteNonQueryRequest) As EDMIServiceReference.ExecuteNonQueryResponse Implements EDMIServiceReference.IEDMIService.ExecuteNonQuery
Return MyBase.Channel.ExecuteNonQuery(pData)
End Function
-
+
Public Function ExecuteNonQueryAsync(ByVal pData As EDMIServiceReference.ExecuteNonQueryRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.ExecuteNonQueryResponse) Implements EDMIServiceReference.IEDMIService.ExecuteNonQueryAsync
Return MyBase.Channel.ExecuteNonQueryAsync(pData)
End Function
-
+
Public Function ReturnDatatable_Firebird(ByVal SQL As String) As EDMIServiceReference.TableResult Implements EDMIServiceReference.IEDMIService.ReturnDatatable_Firebird
Return MyBase.Channel.ReturnDatatable_Firebird(SQL)
End Function
-
+
Public Function ReturnDatatable_FirebirdAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) Implements EDMIServiceReference.IEDMIService.ReturnDatatable_FirebirdAsync
Return MyBase.Channel.ReturnDatatable_FirebirdAsync(SQL)
End Function
-
+
Public Function ReturnScalar_Firebird(ByVal SQL As String) As EDMIServiceReference.ScalarResult Implements EDMIServiceReference.IEDMIService.ReturnScalar_Firebird
Return MyBase.Channel.ReturnScalar_Firebird(SQL)
End Function
-
+
Public Function ReturnScalar_FirebirdAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.ScalarResult) Implements EDMIServiceReference.IEDMIService.ReturnScalar_FirebirdAsync
Return MyBase.Channel.ReturnScalar_FirebirdAsync(SQL)
End Function
-
+
Public Function ExecuteNonQuery_Firebird(ByVal SQL As String) As EDMIServiceReference.NonQueryResult Implements EDMIServiceReference.IEDMIService.ExecuteNonQuery_Firebird
Return MyBase.Channel.ExecuteNonQuery_Firebird(SQL)
End Function
-
+
Public Function ExecuteNonQuery_FirebirdAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.NonQueryResult) Implements EDMIServiceReference.IEDMIService.ExecuteNonQuery_FirebirdAsync
Return MyBase.Channel.ExecuteNonQuery_FirebirdAsync(SQL)
End Function
-
+
Public Function ReturnDatatable_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.TableResult Implements EDMIServiceReference.IEDMIService.ReturnDatatable_MSSQL_IDB
Return MyBase.Channel.ReturnDatatable_MSSQL_IDB(SQL)
End Function
-
+
Public Function ReturnDatatable_MSSQL_IDBAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) Implements EDMIServiceReference.IEDMIService.ReturnDatatable_MSSQL_IDBAsync
Return MyBase.Channel.ReturnDatatable_MSSQL_IDBAsync(SQL)
End Function
-
+
Public Function ReturnScalar_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.ScalarResult Implements EDMIServiceReference.IEDMIService.ReturnScalar_MSSQL_IDB
Return MyBase.Channel.ReturnScalar_MSSQL_IDB(SQL)
End Function
-
+
Public Function ReturnScalar_MSSQL_IDBAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.ScalarResult) Implements EDMIServiceReference.IEDMIService.ReturnScalar_MSSQL_IDBAsync
Return MyBase.Channel.ReturnScalar_MSSQL_IDBAsync(SQL)
End Function
-
+
Public Function ExecuteNonQuery_MSSQL_IDB(ByVal SQL As String) As EDMIServiceReference.NonQueryResult Implements EDMIServiceReference.IEDMIService.ExecuteNonQuery_MSSQL_IDB
Return MyBase.Channel.ExecuteNonQuery_MSSQL_IDB(SQL)
End Function
-
+
Public Function ExecuteNonQuery_MSSQL_IDBAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.NonQueryResult) Implements EDMIServiceReference.IEDMIService.ExecuteNonQuery_MSSQL_IDBAsync
Return MyBase.Channel.ExecuteNonQuery_MSSQL_IDBAsync(SQL)
End Function
-
+
Public Function ReturnDatatable_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.TableResult Implements EDMIServiceReference.IEDMIService.ReturnDatatable_MSSQL_ECM
Return MyBase.Channel.ReturnDatatable_MSSQL_ECM(SQL)
End Function
-
+
Public Function ReturnDatatable_MSSQL_ECMAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.TableResult) Implements EDMIServiceReference.IEDMIService.ReturnDatatable_MSSQL_ECMAsync
Return MyBase.Channel.ReturnDatatable_MSSQL_ECMAsync(SQL)
End Function
-
+
Public Function ReturnScalar_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.ScalarResult Implements EDMIServiceReference.IEDMIService.ReturnScalar_MSSQL_ECM
Return MyBase.Channel.ReturnScalar_MSSQL_ECM(SQL)
End Function
-
+
Public Function ReturnScalar_MSSQL_ECMAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.ScalarResult) Implements EDMIServiceReference.IEDMIService.ReturnScalar_MSSQL_ECMAsync
Return MyBase.Channel.ReturnScalar_MSSQL_ECMAsync(SQL)
End Function
-
+
Public Function ExecuteNonQuery_MSSQL_ECM(ByVal SQL As String) As EDMIServiceReference.NonQueryResult Implements EDMIServiceReference.IEDMIService.ExecuteNonQuery_MSSQL_ECM
Return MyBase.Channel.ExecuteNonQuery_MSSQL_ECM(SQL)
End Function
-
+
Public Function ExecuteNonQuery_MSSQL_ECMAsync(ByVal SQL As String) As System.Threading.Tasks.Task(Of EDMIServiceReference.NonQueryResult) Implements EDMIServiceReference.IEDMIService.ExecuteNonQuery_MSSQL_ECMAsync
Return MyBase.Channel.ExecuteNonQuery_MSSQL_ECMAsync(SQL)
End Function
-
+
Public Function NewFile(ByVal Data As EDMIServiceReference.NewFileRequest) As EDMIServiceReference.NewFileResponse Implements EDMIServiceReference.IEDMIService.NewFile
Return MyBase.Channel.NewFile(Data)
End Function
-
+
Public Function NewFileAsync(ByVal Data As EDMIServiceReference.NewFileRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.NewFileResponse) Implements EDMIServiceReference.IEDMIService.NewFileAsync
Return MyBase.Channel.NewFileAsync(Data)
End Function
-
+
Public Function UpdateFile(ByVal Data As EDMIServiceReference.UpdateFileRequest) As EDMIServiceReference.UpdateFileResponse Implements EDMIServiceReference.IEDMIService.UpdateFile
Return MyBase.Channel.UpdateFile(Data)
End Function
-
+
Public Function UpdateFileAsync(ByVal Data As EDMIServiceReference.UpdateFileRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.UpdateFileResponse) Implements EDMIServiceReference.IEDMIService.UpdateFileAsync
Return MyBase.Channel.UpdateFileAsync(Data)
End Function
-
+
Public Function SetAttributeValue(ByVal Data As EDMIServiceReference.SetAttributeValueRequest) As EDMIServiceReference.SetAttributeValueResponse Implements EDMIServiceReference.IEDMIService.SetAttributeValue
Return MyBase.Channel.SetAttributeValue(Data)
End Function
-
+
Public Function SetAttributeValueAsync(ByVal Data As EDMIServiceReference.SetAttributeValueRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.SetAttributeValueResponse) Implements EDMIServiceReference.IEDMIService.SetAttributeValueAsync
Return MyBase.Channel.SetAttributeValueAsync(Data)
End Function
-
+
Public Function GetAttributeValue(ByVal Data As EDMIServiceReference.GetAttributeValueRequest) As EDMIServiceReference.GetAttributeValueResponse Implements EDMIServiceReference.IEDMIService.GetAttributeValue
Return MyBase.Channel.GetAttributeValue(Data)
End Function
-
+
Public Function GetAttributeValueAsync(ByVal Data As EDMIServiceReference.GetAttributeValueRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.GetAttributeValueResponse) Implements EDMIServiceReference.IEDMIService.GetAttributeValueAsync
Return MyBase.Channel.GetAttributeValueAsync(Data)
End Function
-
+
Public Function GetFileObject(ByVal Data As EDMIServiceReference.GetFileObjectRequest) As EDMIServiceReference.GetFileObjectResponse Implements EDMIServiceReference.IEDMIService.GetFileObject
Return MyBase.Channel.GetFileObject(Data)
End Function
-
+
Public Function GetFileObjectAsync(ByVal Data As EDMIServiceReference.GetFileObjectRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.GetFileObjectResponse) Implements EDMIServiceReference.IEDMIService.GetFileObjectAsync
Return MyBase.Channel.GetFileObjectAsync(Data)
End Function
-
+
Public Function CheckInOutFile(ByVal Data As EDMIServiceReference.CheckInOutFileRequest) As EDMIServiceReference.CheckInOutFileResponse Implements EDMIServiceReference.IEDMIService.CheckInOutFile
Return MyBase.Channel.CheckInOutFile(Data)
End Function
-
+
Public Function CheckInOutFileAsync(ByVal Data As EDMIServiceReference.CheckInOutFileRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.CheckInOutFileResponse) Implements EDMIServiceReference.IEDMIService.CheckInOutFileAsync
Return MyBase.Channel.CheckInOutFileAsync(Data)
End Function
-
+
Public Function ImportFile(ByVal Data As EDMIServiceReference.ImportFileRequest) As EDMIServiceReference.ImportFileResponse Implements EDMIServiceReference.IEDMIService.ImportFile
Return MyBase.Channel.ImportFile(Data)
End Function
-
+
Public Function ImportFileAsync(ByVal Data As EDMIServiceReference.ImportFileRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.ImportFileResponse) Implements EDMIServiceReference.IEDMIService.ImportFileAsync
Return MyBase.Channel.ImportFileAsync(Data)
End Function
-
+
Public Function Globix_ImportFile(ByVal Data As EDMIServiceReference.Globix_ImportFileRequest) As EDMIServiceReference.Globix_ImportFileResponse Implements EDMIServiceReference.IEDMIService.Globix_ImportFile
Return MyBase.Channel.Globix_ImportFile(Data)
End Function
-
+
Public Function Globix_ImportFileAsync(ByVal Data As EDMIServiceReference.Globix_ImportFileRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.Globix_ImportFileResponse) Implements EDMIServiceReference.IEDMIService.Globix_ImportFileAsync
Return MyBase.Channel.Globix_ImportFileAsync(Data)
End Function
-
-
+
+ _
Function EDMIServiceReference_IEDMIService_GetFileByObjectId(ByVal request As EDMIServiceReference.DocumentStreamRequest) As EDMIServiceReference.DocumentStreamResponse Implements EDMIServiceReference.IEDMIService.GetFileByObjectId
Return MyBase.Channel.GetFileByObjectId(request)
End Function
-
+
Public Function GetFileByObjectId(ByVal ObjectId As Long, ByRef FileContents As System.IO.Stream) As String
Dim inValue As EDMIServiceReference.DocumentStreamRequest = New EDMIServiceReference.DocumentStreamRequest()
inValue.ObjectId = ObjectId
- Dim retVal As EDMIServiceReference.DocumentStreamResponse = CType(Me, EDMIServiceReference.IEDMIService).GetFileByObjectId(inValue)
+ Dim retVal As EDMIServiceReference.DocumentStreamResponse = CType(Me,EDMIServiceReference.IEDMIService).GetFileByObjectId(inValue)
FileContents = retVal.FileContents
Return retVal.FileName
End Function
-
-
+
+ _
Function EDMIServiceReference_IEDMIService_GetFileByObjectIdAsync(ByVal request As EDMIServiceReference.DocumentStreamRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentStreamResponse) Implements EDMIServiceReference.IEDMIService.GetFileByObjectIdAsync
Return MyBase.Channel.GetFileByObjectIdAsync(request)
End Function
-
+
Public Function GetFileByObjectIdAsync(ByVal ObjectId As Long) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentStreamResponse)
Dim inValue As EDMIServiceReference.DocumentStreamRequest = New EDMIServiceReference.DocumentStreamRequest()
inValue.ObjectId = ObjectId
- Return CType(Me, EDMIServiceReference.IEDMIService).GetFileByObjectIdAsync(inValue)
+ Return CType(Me,EDMIServiceReference.IEDMIService).GetFileByObjectIdAsync(inValue)
End Function
-
-
+
+ _
Function EDMIServiceReference_IEDMIService_GetFileInfoByObjectId(ByVal request As EDMIServiceReference.DocumentInfoRequest) As EDMIServiceReference.DocumentInfoResponse Implements EDMIServiceReference.IEDMIService.GetFileInfoByObjectId
Return MyBase.Channel.GetFileInfoByObjectId(request)
End Function
-
+
Public Function GetFileInfoByObjectId(ByVal ObjectId As Long, ByVal UserId As Long, ByRef FullPath As String) As EDMIServiceReference.RightsAccessRight
Dim inValue As EDMIServiceReference.DocumentInfoRequest = New EDMIServiceReference.DocumentInfoRequest()
inValue.ObjectId = ObjectId
inValue.UserId = UserId
- Dim retVal As EDMIServiceReference.DocumentInfoResponse = CType(Me, EDMIServiceReference.IEDMIService).GetFileInfoByObjectId(inValue)
+ Dim retVal As EDMIServiceReference.DocumentInfoResponse = CType(Me,EDMIServiceReference.IEDMIService).GetFileInfoByObjectId(inValue)
FullPath = retVal.FullPath
Return retVal.FileRight
End Function
-
+
Public Function GetFileInfoByObjectIdAsync(ByVal request As EDMIServiceReference.DocumentInfoRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentInfoResponse) Implements EDMIServiceReference.IEDMIService.GetFileInfoByObjectIdAsync
Return MyBase.Channel.GetFileInfoByObjectIdAsync(request)
End Function
-
-
+
+ _
Function EDMIServiceReference_IEDMIService_ListFilesForUser(ByVal request As EDMIServiceReference.ListFilesForUserRequest) As EDMIServiceReference.DocumentListResponse Implements EDMIServiceReference.IEDMIService.ListFilesForUser
Return MyBase.Channel.ListFilesForUser(request)
End Function
-
+
Public Function ListFilesForUser() As System.Data.DataTable
Dim inValue As EDMIServiceReference.ListFilesForUserRequest = New EDMIServiceReference.ListFilesForUserRequest()
- Dim retVal As EDMIServiceReference.DocumentListResponse = CType(Me, EDMIServiceReference.IEDMIService).ListFilesForUser(inValue)
+ Dim retVal As EDMIServiceReference.DocumentListResponse = CType(Me,EDMIServiceReference.IEDMIService).ListFilesForUser(inValue)
Return retVal.Datatable
End Function
-
-
+
+ _
Function EDMIServiceReference_IEDMIService_ListFilesForUserAsync(ByVal request As EDMIServiceReference.ListFilesForUserRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentListResponse) Implements EDMIServiceReference.IEDMIService.ListFilesForUserAsync
Return MyBase.Channel.ListFilesForUserAsync(request)
End Function
-
+
Public Function ListFilesForUserAsync() As System.Threading.Tasks.Task(Of EDMIServiceReference.DocumentListResponse)
Dim inValue As EDMIServiceReference.ListFilesForUserRequest = New EDMIServiceReference.ListFilesForUserRequest()
- Return CType(Me, EDMIServiceReference.IEDMIService).ListFilesForUserAsync(inValue)
+ Return CType(Me,EDMIServiceReference.IEDMIService).ListFilesForUserAsync(inValue)
End Function
-
-
+
+ _
Function EDMIServiceReference_IEDMIService_TestObjectIdExists(ByVal request As EDMIServiceReference.TestObjectIdExistsRequest) As EDMIServiceReference.TestObjectIdExistsResponse Implements EDMIServiceReference.IEDMIService.TestObjectIdExists
Return MyBase.Channel.TestObjectIdExists(request)
End Function
-
+
Public Function TestObjectIdExists(ByVal ObjectId As Long, ByRef Exists As Boolean, ByRef Inactive As Boolean) As Boolean
Dim inValue As EDMIServiceReference.TestObjectIdExistsRequest = New EDMIServiceReference.TestObjectIdExistsRequest()
inValue.ObjectId = ObjectId
- Dim retVal As EDMIServiceReference.TestObjectIdExistsResponse = CType(Me, EDMIServiceReference.IEDMIService).TestObjectIdExists(inValue)
+ Dim retVal As EDMIServiceReference.TestObjectIdExistsResponse = CType(Me,EDMIServiceReference.IEDMIService).TestObjectIdExists(inValue)
Exists = retVal.Exists
Inactive = retVal.Inactive
Return retVal.Deleted
End Function
-
+
Public Function TestObjectIdExistsAsync(ByVal request As EDMIServiceReference.TestObjectIdExistsRequest) As System.Threading.Tasks.Task(Of EDMIServiceReference.TestObjectIdExistsResponse) Implements EDMIServiceReference.IEDMIService.TestObjectIdExistsAsync
Return MyBase.Channel.TestObjectIdExistsAsync(request)
End Function
diff --git a/EDMIAPI/Connected Services/EDMIServiceReference/configuration.svcinfo b/EDMIAPI/Connected Services/EDMIServiceReference/configuration.svcinfo
index 42412f6c..69083009 100644
--- a/EDMIAPI/Connected Services/EDMIServiceReference/configuration.svcinfo
+++ b/EDMIAPI/Connected Services/EDMIServiceReference/configuration.svcinfo
@@ -1,5 +1,5 @@
-
+
diff --git a/EDMIAPI/Connected Services/EDMIServiceReference/configuration91.svcinfo b/EDMIAPI/Connected Services/EDMIServiceReference/configuration91.svcinfo
index fe0f5a59..1c1f1177 100644
--- a/EDMIAPI/Connected Services/EDMIServiceReference/configuration91.svcinfo
+++ b/EDMIAPI/Connected Services/EDMIServiceReference/configuration91.svcinfo
@@ -1,5 +1,5 @@
-
+
diff --git a/EDMIAPI/DatabaseWithFallback.vb b/EDMIAPI/DatabaseWithFallback.vb
index 80f35f53..a1f8d387 100644
--- a/EDMIAPI/DatabaseWithFallback.vb
+++ b/EDMIAPI/DatabaseWithFallback.vb
@@ -342,14 +342,17 @@ Public Class DatabaseWithFallback
End Function
Private Async Function GetDatatableFromServiceAsync(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Task(Of DataTable)
- Dim oFallback As Boolean = False
- _Logger.Debug("GetDatatableFromServiceAsync: GetDatatableFromServiceAsync called with SQL [{0}], DatabaseType [{1}], ConnectionId [{2}]", pSQLCommand, DatabaseType.ToString, pConnectionId)
+ _Logger.Debug("GetDatatableFromServiceAsync called | SQL=[{0}] | DB=[{1}] | ConnId=[{2}]",
+ pSQLCommand, DatabaseType.ToString, pConnectionId)
+
If _Client Is Nothing OrElse _ClientConfig?.ForceDirectDatabaseAccess Then
- Return Await Task.Run(Function() GetDatatableFromDatabase(pSQLCommand, DatabaseType, pConnectionId))
+ ' ← Kein Task.Run: direkt synchron, Thread ist ohnehin frei
+ Return GetDatatableFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
End If
- Dim oResult As GetDatatableResponse = Nothing
Try
+ Dim oResult As GetDatatableResponse = Nothing
+
Select Case DatabaseType
Case Constants.DatabaseType.ECM
oResult = Await _Client.GetDatatableFromECMAsync(pSQLCommand)
@@ -360,20 +363,22 @@ Public Class DatabaseWithFallback
End Select
If oResult Is Nothing OrElse oResult.OK = False Then
- _Logger.Warn("⚠ GetDatatableFromServiceAsync failed. Falling back to direct database access.")
- oFallback = True
+ _Logger.Warn("⚠ GetDatatableFromServiceAsync failed | Fallback to DB | Error=[{0}]",
+ If(oResult Is Nothing, "null", oResult.ErrorMessage))
+ Return GetDatatableFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
End If
+
+ Return oResult.Table
+
+ Catch ex As InvalidOperationException
+ _Logger.Warn("⚠ GetDatatableFromServiceAsync offline: [{0}] | Fallback to DB", ex.Message)
+ Return GetDatatableFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
+
Catch ex As Exception
- _Logger.Warn("⚠ GetDatatableFromServiceAsync failed. Falling back to direct database access.")
+ _Logger.Warn("⚠ GetDatatableFromServiceAsync failed | Fallback to DB")
_Logger.Error(ex)
- oFallback = True
+ Return GetDatatableFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
End Try
-
- If oFallback Then
- Return Await Task.Run(Function() GetDatatableFromDatabase(pSQLCommand, DatabaseType, pConnectionId))
- End If
-
- Return oResult.Table
End Function
Private Function GetDatatableFromDatabase(pSQLCommand As String, pDatabaseType As Constants.DatabaseType, pConnectionId As Integer) As DataTable
Try
@@ -401,16 +406,16 @@ Public Class DatabaseWithFallback
End Try
End Function
Private Async Function GetScalarValueFromServiceAsync(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Task(Of Object)
- Dim oFallback As Boolean = False
-
- _Logger.Debug("GetScalarValueFromServiceAsync called with SQL [{0}], DatabaseType [{1}], ConnectionId [{2}]", pSQLCommand, DatabaseType.ToString, pConnectionId)
+ _Logger.Debug("GetScalarValueFromServiceAsync called | SQL=[{0}] | DB=[{1}] | ConnId=[{2}]",
+ pSQLCommand, DatabaseType.ToString, pConnectionId)
If _Client Is Nothing OrElse _ClientConfig?.ForceDirectDatabaseAccess Then
- Return Await Task.Run(Function() GetScalarValueFromDatabase(pSQLCommand, DatabaseType, pConnectionId))
+ Return GetScalarValueFromDatabase(pSQLCommand, DatabaseType, pConnectionId) ' ← kein Task.Run
End If
- Dim oResult As GetScalarValueResponse = Nothing
Try
+ Dim oResult As GetScalarValueResponse = Nothing
+
Select Case DatabaseType
Case Constants.DatabaseType.ECM
oResult = Await _Client.GetScalarValueFromECMAsync(pSQLCommand)
@@ -421,20 +426,21 @@ Public Class DatabaseWithFallback
End Select
If oResult Is Nothing OrElse oResult.OK = False Then
- _Logger.Warn("⚠ GetScalarValueFromServiceAsync failed. Falling back to direct database access.")
- oFallback = True
+ _Logger.Warn("⚠ GetScalarValueFromServiceAsync failed | Fallback to DB")
+ Return GetScalarValueFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
End If
+
+ Return oResult.Scalar
+
+ Catch ex As InvalidOperationException
+ _Logger.Warn("⚠ GetScalarValueFromServiceAsync offline: [{0}] | Fallback to DB", ex.Message)
+ Return GetScalarValueFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
+
Catch ex As Exception
- _Logger.Warn("⚠ GetScalarValueFromServiceAsync failed. Falling back to direct database access.")
+ _Logger.Warn("⚠ GetScalarValueFromServiceAsync failed | Fallback to DB")
_Logger.Error(ex)
- oFallback = True
+ Return GetScalarValueFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
End Try
-
- If oFallback Then
- Return Await Task.Run(Function() GetScalarValueFromDatabase(pSQLCommand, DatabaseType, pConnectionId))
- End If
-
- Return oResult.Scalar
End Function
Private Function GetScalarValueFromService(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Object
Try
@@ -493,16 +499,16 @@ Public Class DatabaseWithFallback
End Try
End Function
Private Async Function ExecuteNonQueryFromServiceAsync(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Task(Of Boolean)
- Dim oFallback As Boolean = False
-
- _Logger.Debug("ExecuteNonQueryFromServiceAsync called with SQL [{0}], DatabaseType [{1}], ConnectionId [{2}]", pSQLCommand, DatabaseType.ToString, pConnectionId)
+ _Logger.Debug("ExecuteNonQueryFromServiceAsync called | SQL=[{0}] | DB=[{1}] | ConnId=[{2}]",
+ pSQLCommand, DatabaseType.ToString, pConnectionId)
If _Client Is Nothing OrElse _ClientConfig?.ForceDirectDatabaseAccess Then
- Return Await Task.Run(Function() ExecuteNonQueryFromDatabase(pSQLCommand, DatabaseType, pConnectionId))
+ Return ExecuteNonQueryFromDatabase(pSQLCommand, DatabaseType, pConnectionId) ' ← kein Task.Run
End If
- Dim oResult As ExecuteNonQueryResponse = Nothing
Try
+ Dim oResult As ExecuteNonQueryResponse = Nothing
+
Select Case DatabaseType
Case Constants.DatabaseType.ECM
oResult = Await _Client.ExecuteNonQueryFromECMAsync(pSQLCommand)
@@ -513,20 +519,21 @@ Public Class DatabaseWithFallback
End Select
If oResult Is Nothing OrElse oResult.OK = False Then
- _Logger.Warn("⚠ ExecuteNonQueryFromServiceAsync failed. Falling back to direct database access.")
- oFallback = True
+ _Logger.Warn("⚠ ExecuteNonQueryFromServiceAsync failed | Fallback to DB")
+ Return ExecuteNonQueryFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
End If
+
+ Return oResult.Result
+
+ Catch ex As InvalidOperationException
+ _Logger.Warn("⚠ ExecuteNonQueryFromServiceAsync offline: [{0}] | Fallback to DB", ex.Message)
+ Return ExecuteNonQueryFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
+
Catch ex As Exception
- _Logger.Warn("⚠ ExecuteNonQueryFromServiceAsync failed. Falling back to direct database access.")
+ _Logger.Warn("⚠ ExecuteNonQueryFromServiceAsync failed | Fallback to DB")
_Logger.Error(ex)
- oFallback = True
+ Return ExecuteNonQueryFromDatabase(pSQLCommand, DatabaseType, pConnectionId)
End Try
-
- If oFallback Then
- Return Await Task.Run(Function() ExecuteNonQueryFromDatabase(pSQLCommand, DatabaseType, pConnectionId))
- End If
-
- Return oResult.Result
End Function
Private Function ExecuteNonQueryFromService(pSQLCommand As String, DatabaseType As Constants.DatabaseType, pConnectionId As Integer) As Boolean
Try
diff --git a/EDMIAPI/My Project/AssemblyInfo.vb b/EDMIAPI/My Project/AssemblyInfo.vb
index 1ef4ff0e..2d7aae46 100644
--- a/EDMIAPI/My Project/AssemblyInfo.vb
+++ b/EDMIAPI/My Project/AssemblyInfo.vb
@@ -13,7 +13,7 @@ Imports System.Runtime.InteropServices
-
+
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
' übernehmen, indem Sie "*" eingeben:
'
-
+
diff --git a/EDMIAPI/Reference.vb b/EDMIAPI/Reference.vb
new file mode 100644
index 00000000..b7ca66f0
--- /dev/null
+++ b/EDMIAPI/Reference.vb
@@ -0,0 +1,3401 @@
+'------------------------------------------------------------------------------
+'
+' Dieser Code wurde von einem Tool generiert.
+' Laufzeitversion:4.0.30319.42000
+'
+' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+' der Code erneut generiert wird.
+'
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+Imports System
+Imports System.Runtime.Serialization
+
+Namespace EDMIServiceReference
+
+ _
+ Partial Public Class BaseResponse
+ Inherits Object
+ Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
+
+ _
+ Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
+
+ _
+ Private ErrorDetailsField As String
+
+ _
+ Private ErrorMessageField As String
+
+ _
+ Private OKField As Boolean
+
+ _
+ Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
+ Get
+ Return Me.extensionDataField
+ End Get
+ Set
+ Me.extensionDataField = value
+ End Set
+ End Property
+
+ _
+ Public Property ErrorDetails() As String
+ Get
+ Return Me.ErrorDetailsField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ErrorDetailsField, value) <> true) Then
+ Me.ErrorDetailsField = value
+ Me.RaisePropertyChanged("ErrorDetails")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property ErrorMessage() As String
+ Get
+ Return Me.ErrorMessageField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ErrorMessageField, value) <> true) Then
+ Me.ErrorMessageField = value
+ Me.RaisePropertyChanged("ErrorMessage")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property OK() As Boolean
+ Get
+ Return Me.OKField
+ End Get
+ Set
+ If (Me.OKField.Equals(value) <> true) Then
+ Me.OKField = value
+ Me.RaisePropertyChanged("OK")
+ End If
+ End Set
+ End Property
+
+ Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
+
+ Protected Sub RaisePropertyChanged(ByVal propertyName As String)
+ Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent
+ If (Not (propertyChanged) Is Nothing) Then
+ propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
+ End If
+ End Sub
+ End Class
+
+ _
+ Partial Public Class TableResult
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private TableField As System.Data.DataTable
+
+ _
+ Public Property Table() As System.Data.DataTable
+ Get
+ Return Me.TableField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.TableField, value) <> true) Then
+ Me.TableField = value
+ Me.RaisePropertyChanged("Table")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class ScalarResult
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ScalarField As Object
+
+ _
+ Public Property Scalar() As Object
+ Get
+ Return Me.ScalarField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ScalarField, value) <> true) Then
+ Me.ScalarField = value
+ Me.RaisePropertyChanged("Scalar")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class NonQueryResult
+ Inherits EDMIServiceReference.BaseResponse
+ End Class
+
+ _
+ Partial Public Class GetDatatableResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private TableField As System.Data.DataTable
+
+ _
+ Public Property Table() As System.Data.DataTable
+ Get
+ Return Me.TableField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.TableField, value) <> true) Then
+ Me.TableField = value
+ Me.RaisePropertyChanged("Table")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class GetScalarValueResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ScalarField As Object
+
+ _
+ Public Property Scalar() As Object
+ Get
+ Return Me.ScalarField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ScalarField, value) <> true) Then
+ Me.ScalarField = value
+ Me.RaisePropertyChanged("Scalar")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class ExecuteNonQueryResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ResultField As Boolean
+
+ _
+ Public Property Result() As Boolean
+ Get
+ Return Me.ResultField
+ End Get
+ Set
+ If (Me.ResultField.Equals(value) <> true) Then
+ Me.ResultField = value
+ Me.RaisePropertyChanged("Result")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class NewFileResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ObjectIdField As Long
+
+ _
+ Public Property ObjectId() As Long
+ Get
+ Return Me.ObjectIdField
+ End Get
+ Set
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
+ Me.RaisePropertyChanged("ObjectId")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class UpdateFileResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ObjectIdField As Long
+
+ _
+ Public Property ObjectId() As Long
+ Get
+ Return Me.ObjectIdField
+ End Get
+ Set
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
+ Me.RaisePropertyChanged("ObjectId")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class SetAttributeValueResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ObjectIdField As Long
+
+ _
+ Public Property ObjectId() As Long
+ Get
+ Return Me.ObjectIdField
+ End Get
+ Set
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
+ Me.RaisePropertyChanged("ObjectId")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class GetAttributeValueResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ObjectIdField As Long
+
+ _
+ Private ValueField As Object
+
+ _
+ Public Property ObjectId() As Long
+ Get
+ Return Me.ObjectIdField
+ End Get
+ Set
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
+ Me.RaisePropertyChanged("ObjectId")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property Value() As Object
+ Get
+ Return Me.ValueField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ValueField, value) <> true) Then
+ Me.ValueField = value
+ Me.RaisePropertyChanged("Value")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class GetFileObjectResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private FileObjectField As EDMIServiceReference.FileObject
+
+ _
+ Public Property FileObject() As EDMIServiceReference.FileObject
+ Get
+ Return Me.FileObjectField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.FileObjectField, value) <> true) Then
+ Me.FileObjectField = value
+ Me.RaisePropertyChanged("FileObject")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class CheckInOutFileResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ObjectIdField As Long
+
+ _
+ Public Property ObjectId() As Long
+ Get
+ Return Me.ObjectIdField
+ End Get
+ Set
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
+ Me.RaisePropertyChanged("ObjectId")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class ImportFileResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ObjectIdField As Long
+
+ _
+ Public Property ObjectId() As Long
+ Get
+ Return Me.ObjectIdField
+ End Get
+ Set
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
+ Me.RaisePropertyChanged("ObjectId")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class Globix_ImportFileResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ObjectIdField As Long
+
+ _
+ Public Property ObjectId() As Long
+ Get
+ Return Me.ObjectIdField
+ End Get
+ Set
+ If (Me.ObjectIdField.Equals(value) <> true) Then
+ Me.ObjectIdField = value
+ Me.RaisePropertyChanged("ObjectId")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class GetClientConfigResponse
+ Inherits EDMIServiceReference.BaseResponse
+
+ _
+ Private ClientConfigField As EDMIServiceReference.GlobalStateClientConfiguration
+
+ _
+ Public Property ClientConfig() As EDMIServiceReference.GlobalStateClientConfiguration
+ Get
+ Return Me.ClientConfigField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ClientConfigField, value) <> true) Then
+ Me.ClientConfigField = value
+ Me.RaisePropertyChanged("ClientConfig")
+ End If
+ End Set
+ End Property
+ End Class
+
+ _
+ Partial Public Class GlobalStateClientConfiguration
+ Inherits Object
+ Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
+
+ _
+ Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
+
+ _
+ Private ConnectionStringECMField As String
+
+ _
+ Private ConnectionStringIDBField As String
+
+ _
+ Private DocumentTypesField() As EDMIServiceReference.GlobalStateDoctype
+
+ _
+ Private ForceDirectDatabaseAccessField As Boolean
+
+ _
+ Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
+ Get
+ Return Me.extensionDataField
+ End Get
+ Set
+ Me.extensionDataField = value
+ End Set
+ End Property
+
+ _
+ Public Property ConnectionStringECM() As String
+ Get
+ Return Me.ConnectionStringECMField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ConnectionStringECMField, value) <> true) Then
+ Me.ConnectionStringECMField = value
+ Me.RaisePropertyChanged("ConnectionStringECM")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property ConnectionStringIDB() As String
+ Get
+ Return Me.ConnectionStringIDBField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ConnectionStringIDBField, value) <> true) Then
+ Me.ConnectionStringIDBField = value
+ Me.RaisePropertyChanged("ConnectionStringIDB")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property DocumentTypes() As EDMIServiceReference.GlobalStateDoctype()
+ Get
+ Return Me.DocumentTypesField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.DocumentTypesField, value) <> true) Then
+ Me.DocumentTypesField = value
+ Me.RaisePropertyChanged("DocumentTypes")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property ForceDirectDatabaseAccess() As Boolean
+ Get
+ Return Me.ForceDirectDatabaseAccessField
+ End Get
+ Set
+ If (Me.ForceDirectDatabaseAccessField.Equals(value) <> true) Then
+ Me.ForceDirectDatabaseAccessField = value
+ Me.RaisePropertyChanged("ForceDirectDatabaseAccess")
+ End If
+ End Set
+ End Property
+
+ Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
+
+ Protected Sub RaisePropertyChanged(ByVal propertyName As String)
+ Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent
+ If (Not (propertyChanged) Is Nothing) Then
+ propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
+ End If
+ End Sub
+ End Class
+
+ _
+ Partial Public Class GlobalStateDoctype
+ Inherits Object
+ Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
+
+ _
+ Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
+
+ _
+ Private FileChangedActionField As String
+
+ _
+ Private NameField As String
+
+ _
+ Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
+ Get
+ Return Me.extensionDataField
+ End Get
+ Set
+ Me.extensionDataField = value
+ End Set
+ End Property
+
+ _
+ Public Property FileChangedAction() As String
+ Get
+ Return Me.FileChangedActionField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.FileChangedActionField, value) <> true) Then
+ Me.FileChangedActionField = value
+ Me.RaisePropertyChanged("FileChangedAction")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property Name() As String
+ Get
+ Return Me.NameField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.NameField, value) <> true) Then
+ Me.NameField = value
+ Me.RaisePropertyChanged("Name")
+ End If
+ End Set
+ End Property
+
+ Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
+
+ Protected Sub RaisePropertyChanged(ByVal propertyName As String)
+ Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent
+ If (Not (propertyChanged) Is Nothing) Then
+ propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
+ End If
+ End Sub
+ End Class
+
+ _
+ Partial Public Class UnexpectedErrorFault
+ Inherits EDMIServiceReference.BaseFault
+ End Class
+
+ _
+ Partial Public Class BaseFault
+ Inherits Object
+ Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
+
+ _
+ Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
+
+ _
+ Private ErrorMessageField As String
+
+ _
+ Private InnerExceptionField As System.Exception
+
+ _
+ Private IsRecoverableField As Boolean
+
+ _
+ Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
+ Get
+ Return Me.extensionDataField
+ End Get
+ Set
+ Me.extensionDataField = value
+ End Set
+ End Property
+
+ _
+ Public Property ErrorMessage() As String
+ Get
+ Return Me.ErrorMessageField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.ErrorMessageField, value) <> true) Then
+ Me.ErrorMessageField = value
+ Me.RaisePropertyChanged("ErrorMessage")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property InnerException() As System.Exception
+ Get
+ Return Me.InnerExceptionField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.InnerExceptionField, value) <> true) Then
+ Me.InnerExceptionField = value
+ Me.RaisePropertyChanged("InnerException")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property IsRecoverable() As Boolean
+ Get
+ Return Me.IsRecoverableField
+ End Get
+ Set
+ If (Me.IsRecoverableField.Equals(value) <> true) Then
+ Me.IsRecoverableField = value
+ Me.RaisePropertyChanged("IsRecoverable")
+ End If
+ End Set
+ End Property
+
+ Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
+
+ Protected Sub RaisePropertyChanged(ByVal propertyName As String)
+ Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent
+ If (Not (propertyChanged) Is Nothing) Then
+ propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
+ End If
+ End Sub
+ End Class
+
+ _
+ Partial Public Class DataTableDoesNotExistFault
+ Inherits EDMIServiceReference.BaseFault
+ End Class
+
+ _
+ Partial Public Class ObjectDoesNotExistFault
+ Inherits EDMIServiceReference.BaseFault
+ End Class
+
+ _
+ Partial Public Class GetDatatableRequest
+ Inherits Object
+ Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
+
+ _
+ Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject
+
+ _
+ Private ConnectionIdField As Integer
+
+ _
+ Private DatabaseTypeField As EDMIServiceReference.DatabaseType
+
+ _
+ Private NamedDatabaseField As EDMIServiceReference.DatabaseName
+
+ _
+ Private SqlCommandField As String
+
+ _
+ Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
+ Get
+ Return Me.extensionDataField
+ End Get
+ Set
+ Me.extensionDataField = value
+ End Set
+ End Property
+
+ _
+ Public Property ConnectionId() As Integer
+ Get
+ Return Me.ConnectionIdField
+ End Get
+ Set
+ If (Me.ConnectionIdField.Equals(value) <> true) Then
+ Me.ConnectionIdField = value
+ Me.RaisePropertyChanged("ConnectionId")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property DatabaseType() As EDMIServiceReference.DatabaseType
+ Get
+ Return Me.DatabaseTypeField
+ End Get
+ Set
+ If (Me.DatabaseTypeField.Equals(value) <> true) Then
+ Me.DatabaseTypeField = value
+ Me.RaisePropertyChanged("DatabaseType")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property NamedDatabase() As EDMIServiceReference.DatabaseName
+ Get
+ Return Me.NamedDatabaseField
+ End Get
+ Set
+ If (Me.NamedDatabaseField.Equals(value) <> true) Then
+ Me.NamedDatabaseField = value
+ Me.RaisePropertyChanged("NamedDatabase")
+ End If
+ End Set
+ End Property
+
+ _
+ Public Property SqlCommand() As String
+ Get
+ Return Me.SqlCommandField
+ End Get
+ Set
+ If (Object.ReferenceEquals(Me.SqlCommandField, value) <> true) Then
+ Me.SqlCommandField = value
+ Me.RaisePropertyChanged("SqlCommand")
+ End If
+ End Set
+ End Property
+
+ Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
+
+ Protected Sub RaisePropertyChanged(ByVal propertyName As String)
+ Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent
+ If (Not (propertyChanged) Is Nothing) Then
+ propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
+ End If
+ End Sub
+ End Class
+
+ _
+ Public Enum DatabaseType As Integer
+
+