From 16193b08cf574f7feca6d20d57ee46739989a550 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Mon, 14 Dec 2020 11:20:19 +0100 Subject: [PATCH] EDMIService: Fix replacing tables --- GUIs.Test.TestGUI/frmRelations.Designer.vb | 13 ++++++ GUIs.Test.TestGUI/frmRelations.vb | 14 ++++-- Service.EDMIService/Scheduler/JobListener.vb | 47 +++++++++++++------- 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/GUIs.Test.TestGUI/frmRelations.Designer.vb b/GUIs.Test.TestGUI/frmRelations.Designer.vb index b6dea2be..4c9ecd79 100644 --- a/GUIs.Test.TestGUI/frmRelations.Designer.vb +++ b/GUIs.Test.TestGUI/frmRelations.Designer.vb @@ -22,16 +22,29 @@ Partial Class frmRelations 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. _ Private Sub InitializeComponent() + Me.Button1 = New System.Windows.Forms.Button() Me.SuspendLayout() ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(12, 12) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(75, 23) + Me.Button1.TabIndex = 0 + Me.Button1.Text = "Button1" + Me.Button1.UseVisualStyleBackColor = True + ' 'frmRelations ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(800, 450) + Me.Controls.Add(Me.Button1) Me.Name = "frmRelations" Me.Text = "frmRelations" Me.ResumeLayout(False) End Sub + + Friend WithEvents Button1 As Button End Class diff --git a/GUIs.Test.TestGUI/frmRelations.vb b/GUIs.Test.TestGUI/frmRelations.vb index 39a2d208..59c7bc7c 100644 --- a/GUIs.Test.TestGUI/frmRelations.vb +++ b/GUIs.Test.TestGUI/frmRelations.vb @@ -5,6 +5,9 @@ Imports DigitalData.Services.EDMIService Public Class frmRelations Private DB As MSSQLServer Private LogConfig As LogConfig + Private JobResult As JobResult + Private JobListener As JobListener + Private DetailRow As DataRow Private Sub frmRelations_Load(sender As Object, e As EventArgs) Handles MyBase.Load LogConfig = New LogConfig(LogConfig.PathType.CustomPath, Application.StartupPath) @@ -18,13 +21,18 @@ Public Class frmRelations oGroupUser.TableName = "TBDD_GROUPS_USER" Dim oCronDetails As DataTable = DB.GetDatatable("SELECT * FROM TBAPPSERV_CRON_DETAIL WHERE DT_NAME = 'TBDD_USER'") + JobListener = New JobListener(LogConfig, DB, oDataSet) - Dim oListener As New DigitalData.Services.EDMIService.JobListener(LogConfig, DB, oDataSet) - oListener.SaveDataTables(New DigitalData.Services.EDMIService.JobResult() With { + DetailRow = oCronDetails.Rows.Item(0) + JobResult = New JobResult() With { .Table = oUsers, .TableRelationColumn = "GUID", .ChildTable = oGroupUser, .ChildRelationColumn = "USER_ID" - }, oCronDetails.Rows.Item(0)) + } + End Sub + + Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click + JobListener.SaveDataTables(JobResult, DetailRow) End Sub End Class \ No newline at end of file diff --git a/Service.EDMIService/Scheduler/JobListener.vb b/Service.EDMIService/Scheduler/JobListener.vb index 4e8ed886..99cf4c40 100644 --- a/Service.EDMIService/Scheduler/JobListener.vb +++ b/Service.EDMIService/Scheduler/JobListener.vb @@ -26,16 +26,35 @@ Public Class JobListener Dataset = ResultDataSet End Sub - Public Sub ReplaceExistingTable(Name As String, Table As DataTable, DataSet As DataSet) + Public Sub ReplaceExistingTable(Name As String, Table As DataTable, DataSet As DataSet, Optional ChildTable As DataTable = Nothing) Dim oDatatableNameTemp As String = Name & "-TEMP" _Logger.Debug("DataTable [{0}] exists, renaming and replacing in DataSet", Name) ' Rename the new table, add TEMP suffix Table.TableName = oDatatableNameTemp + + ' If child table exists, remove all connections to it + If ChildTable IsNot Nothing Then + ' Get name for relations and constraints + Dim oRelationName = GetRelationName(Name, ChildTable.TableName) + + ' Remove the relation + Dim oRelation As DataRelation = DataSet.Relations.Item(oRelationName) + DataSet.Relations.Remove(oRelation) + + ' Remove the constraint + Dim oConstraint As Constraint = ChildTable.Constraints.Item(oRelationName) + ChildTable.Constraints.Remove(oConstraint) + End If + + ' Remove the temp table if it exists + If DataSet.Tables.Contains(oDatatableNameTemp) Then + DataSet.Tables.Remove(Table) + End If + ' Add the new table to the dataset DataSet.Tables.Add(Table) - ' Remove the old table - DataSet.Tables.Remove(Name) + ' Rename the new table DataSet.Tables.Item(oDatatableNameTemp).TableName = Name End Sub @@ -46,11 +65,15 @@ Public Class JobListener DataSet.Tables.Add(Table) End Sub + Public Function GetRelationName(ParentTableName As String, ChildTableName As String) As String + Return $"{ParentTableName}-{ChildTableName}" + End Function + Public Sub AddRelation(ParentTableName As String, ParentColumnName As String, ChildTableName As String, ChildColumnName As String) Dim oChild As DataTable = Dataset.Tables.Item(ChildTableName) Dim oParent As DataTable = Dataset.Tables.Item(ParentTableName) - Dim oRelationName As String = $"{ParentTableName}-{ChildTableName}" + Dim oRelationName As String = GetRelationName(ParentTableName, ChildTableName) Dim oParentColumn As DataColumn = oParent.Columns.Item(ParentColumnName) Dim oChildColumn As DataColumn = oChild.Columns.Item(ChildColumnName) @@ -90,24 +113,18 @@ Public Class JobListener Public Sub SaveDataTables(Result As JobResult, DetailRow As DataRow) Try Dim oTable As DataTable = Result.Table + Dim oName As String = DetailRow.Item("DT_NAME") Dim oDetailId As Integer = DetailRow.Item("GUID") Dim oDatatableNameTemp As String = oName & "-TEMP" If Dataset.Tables.Contains(oName) Then + ' Replace existing table If Result.ChildTable IsNot Nothing Then - ReplaceExistingTable(Result.ChildTable.TableName, Result.ChildTable, Dataset) - End If - ReplaceExistingTable(oName, oTable, Dataset) - - If Result.ChildTable IsNot Nothing Then - Dim oRelation = Dataset.Relations.Item($"{oTable.TableName}-{Result.ChildTable.TableName}") - - If oRelation IsNot Nothing Then - Dataset.Relations.Remove(oRelation) - End If - + ReplaceExistingTable(oName, oTable, Dataset, Result.ChildTable) AddRelation(oName, Result.TableRelationColumn, Result.ChildTable.TableName, Result.ChildRelationColumn) + Else + ReplaceExistingTable(oName, oTable, Dataset) End If Else AddNewTable(oName, oTable, Dataset)