Greg Gregerson Ответов: 0

Связывание полей при создании отношения набора данных


Код прекрасно работает и так - за одним исключением.

Поля связывания для отношения (EmpNo) отображаются в окончательном XML-документе как в узле Employee, так и в узле WorkAssignment. Узел WorkAssignment не должен иметь EmpNo, только остальные пять полей.

Проведя некоторые исследования, я думаю, что использование GetChildRows может быть тем, что мне нужно, но я не могу найти никакого кода, который показал бы мне, как это использовать. VB.Net, это также показывает, как добавить его в набор данных, чтобы ds.Последняя команда WriteXML() работает правильно.

Любая помощь будет очень признательна.

Спасибо - Грег Грегерсон

Что я уже пробовал:

<pre>Imports System.IO

Public Class Form1
    Public watchfolder As FileSystemWatcher


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnStart.Click

        ' Enable the file watcher
        watchfolder = New System.IO.FileSystemWatcher
        watchfolder.SynchronizingObject = Me

        ' Set the folder path
        watchfolder.Path = txtPath.Text

        ' Enable specific filters
        watchfolder.NotifyFilter = IO.NotifyFilters.DirectoryName
        watchfolder.NotifyFilter = watchfolder.NotifyFilter Or IO.NotifyFilters.FileName
        watchfolder.NotifyFilter = watchfolder.NotifyFilter Or IO.NotifyFilters.LastWrite
        watchfolder.NotifyFilter = watchfolder.NotifyFilter Or IO.NotifyFilters.Attributes

        ' Add the handler for each event
        AddHandler watchfolder.Changed, AddressOf logChange
        AddHandler watchfolder.Created, AddressOf logChange
        AddHandler watchfolder.Deleted, AddressOf logChange

        ' Start watching
        watchfolder.EnableRaisingEvents = True

        ' Set the buttons
        btnStart.Enabled = False
        btnStop.Enabled = True
        btnConvert.Enabled = False

    End Sub

    Private Sub logChange(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
        If e.ChangeType = IO.WatcherChangeTypes.Created Then
            txtFiles.Text &= e.FullPath & vbCrLf
        End If
        If e.ChangeType = IO.WatcherChangeTypes.Deleted Then
            txtFiles.Text &= "File " & e.FullPath &
                                    " has been deleted" & vbCrLf
        End If
    End Sub

    Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
        watchfolder.EnableRaisingEvents = False
        btnStart.Enabled = False
        btnStop.Enabled = False
        btnConvert.Enabled = True
    End Sub

    Private Sub btnConvert_Click(sender As Object, e As EventArgs) Handles btnConvert.Click
        Dim dir As String = txtPath.Text
        Dim i As Integer = 1
        Dim fileEntries As String() = Directory.GetFiles(dir, "*.txt")
        Dim fileName As String

        ' Create the employee data table
        Dim tbl As DataTable = New DataTable("Employee")
        tbl.Columns.Add(New DataColumn With {.ColumnName = "XRefCode", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "EmpNo", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "First", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "Last", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "Gender", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "SSN", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "HireDate", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "OriginalHire", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "DOB", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "StartDate", .DataType = GetType(String)})
        tbl.Columns.Add(New DataColumn With {.ColumnName = "SeniorityDate", .DataType = GetType(String)})

        ' Create the work assignment data table
        Dim watbl As DataTable = New DataTable("WorkAssignment")
        watbl.Columns.Add(New DataColumn With {.ColumnName = "EmpNo", .DataType = GetType(String)})
        watbl.Columns.Add(New DataColumn With {.ColumnName = "JobXRefCode", .DataType = GetType(String)})
        watbl.Columns.Add(New DataColumn With {.ColumnName = "DeptXRefCode", .DataType = GetType(String)})
        watbl.Columns.Add(New DataColumn With {.ColumnName = "OrgXRefCode", .DataType = GetType(String)})
        watbl.Columns.Add(New DataColumn With {.ColumnName = "IsPrimary", .DataType = GetType(String)})
        watbl.Columns.Add(New DataColumn With {.ColumnName = "EffectiveStart", .DataType = GetType(String)})

        ' Process the list of .txt files found in the directory. '
        For Each fileName In fileEntries

            ' Make sure the file exists (Note:  probably not needed)
            If (System.IO.File.Exists(fileName)) Then

                'Create a streamreader to read the contents of the file
                Dim fileString As String
                Dim sr As IO.StreamReader = New IO.StreamReader(fileName)

                While sr.Peek() >= 0
                    ' Read a row in the file 
                    fileString = sr.ReadLine
                    Dim temp() As Object = fileString.Split("|")

                    ' Create the array for the employee table
                    Dim tempE(10) As String
                    Array.Copy(temp, 0, tempE, 0, 11)

                    ' Create the array for the work assignment table
                    Dim tempW(5) As String
                    tempW(0) = temp(0)
                    tempW(1) = temp(11)
                    tempW(2) = temp(12)
                    tempW(3) = temp(13)
                    tempW(4) = temp(14)
                    tempW(5) = temp(15)

                    ' Add the array data to the table                    
                    tbl.Rows.Add(tempE)
                    watbl.Rows.Add(tempW)

                End While

            End If
        Next

        ' Create a DataSet and add the employees table to it
        Dim ds As DataSet = New DataSet("EmployeeImport")
        ds.Tables.Add(tbl)
        ds.Tables.Add(watbl)

        'Add DataRelation to DataSet:
        Dim pClmn, cClmn As DataColumn
        pClmn = tbl.Columns("EmpNo")
        cClmn = watbl.Columns("EmpNo")

        'Create DataRelation:
        Dim dr As DataRelation = New DataRelation("Emp_WA", pClmn, cClmn)
        dr.Nested = True

        ' Add the relation to the dataset
        ds.Relations.Add(dr)

        ' Write XML to file
        ds.WriteXml(dir & "\Test.xml")

    End Sub
End Class

Gerry Schmitz

Если все остальное работает нормально, я бы "исправил" xml; "WriteXml" делает то, что он делает. Или создайте теневой сценарий только для xml (или рискуйте сломать то, что у вас есть).

0 Ответов