DatatColumn Datatyp nachträglich ändern oder XML Datum in DateTime konvertieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Kim.

    DatatColumn Datatyp nachträglich ändern oder XML Datum in DateTime konvertieren

    Hallo Zusammen,

    Ich habe leider Anfangs ein falschen DataTyp für die Datumspalte in einer DataTable genommen und möchte diesen Fehler jetzt gerne korrigieren.

    Ich würde diese Spalte später gerne Filtern und auch Sortieren, da wird es als Datum als String ziemlich schwierig.

    Ich kann auch eine neue DataTable erstellen nur kann ich die gespeicherte XML dann nicht lesen, da er das Format (01.01.2001 14:00:00) nicht als DateTime Format erkennt.

    Wie kann ich in XML gespeicherte Werte Konvertieren? oder muss ich hier ganz anders vorgehen?

    Vielen Dank

    Beste Grüße

    Kim
    ... nur kann ich die gespeicherte XML dann nicht lesen, da er das Format (01.01.2001 14:00:00) nicht als DateTime Format erkennt


    Was kriegst du für eine Fehlermeldung wenn du versucht das zu konvertieren? Convert.ToDateTime("01.01.2001 14:00:00")

    Bei mir geht das.
    Bilder
    • DateTime.PNG

      4,69 kB, 455×49, 71 mal angesehen


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    du könntest deiner DataTable eine zusätzliche spalte angedeihen lassen mit datentyp Date
    Dataset einlesen
    alle zeilen durchgehen, und von der String-Spalte eine Date-Konvertierung in die Date-Spalte eintragen.
    abspeichern.

    Dann mit Notepad++ - textersatz Datei öffnen und alle String-Datum-Einträge löschen
    dann mit Notepad++ - textersatz alle Datum-Einträge umbenennen

    vorher Backup machen.
    Entweder so wie @ErfinderDesRades geschrieben hat oder mit zwei unabhängigen Klassen arbeiten und diese untereinander mappen. aus Erfahrung weiß ich, dass man gerade wenn man alte Strukturen zu neuen umbauen will oftmals die alte Struktur nicht anfassen kann. Wie greifst du auf die Daten zu? XMLDocument, Klassenserialisierung, per Text einlesen (bitte nicht!!!).
    Bei XML-Serialisierung würde ich mit zwei Klassen arbeiten, bei XMLDocument ist der Ansatz von @ErfinderDesRades deutlich einfacher und du kannst dir das Mapping sparen.

    EDIT: Gerade nochmal deinen Startpost gelesen. Liest du die Daten aus der XML ins DataTable ein? Also mit ReadXml und WriteXML?


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Okay :D

    Dann haben wir es ja jetzt.

    So in diesem Fall würde ich aber ganz anders vorgehen. DataTable benutze ich allenfalls zum Auslesen. Danach ziehe ich die Daten direkt in ein DataModel und arbeite damit weiter.

    Wenn du willst baue ich dir gerne ein DataModel, dass direkt auch dein Problem behebt. Aber dafür müsste ich wissen wie deine XML-Struktur aussieht. Also welche Felder du hast.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Super Danke das ist nett.

    Die Spalten "Datum" und "Zeitstempel" müsste ich als DateTime haben. Anfangs wurden hier leider alle Spalten als String angegeben.
    Bilder
    • 1.jpg

      37,12 kB, 673×546, 61 mal angesehen
    • 2.jpg

      83,79 kB, 1.552×389, 56 mal angesehen
    Du legst dir 2 Klassen an

    Neue Entität

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Xml.Serialization
    3. Namespace Entities
    4. <Serializable(),
    5. DebuggerStepThrough(),
    6. DesignerCategory("code"),
    7. XmlType(AnonymousType:=True),
    8. XmlRoot([Namespace]:="", IsNullable:=False, ElementName:="VERW_DataSet")>
    9. Public Class VERW_DataSet
    10. Inherits List(Of VERW_Übersicht)
    11. End Class
    12. <Serializable(),
    13. DebuggerStepThrough(),
    14. DesignerCategory("code"),
    15. XmlType(AnonymousType:=True),
    16. XmlRoot([Namespace]:="", IsNullable:=False)>
    17. Public Class VERW_Übersicht
    18. <XmlElement(ElementName:="Datum", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=1)>
    19. Public Property Datum As Nullable(Of Date)
    20. <XmlElement(ElementName:="Artikel", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=2)>
    21. Public Property Artikel As String
    22. <XmlElement(ElementName:="Bezeichnung", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=3)>
    23. Public Property Bezeichnung As String
    24. <XmlElement(ElementName:="Charge", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=4)>
    25. Public Property Charge As String
    26. <XmlElement(ElementName:="Menge", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=5)>
    27. Public Property Menge As Nullable(Of Integer)
    28. <XmlElement(ElementName:="Behälter", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=6)>
    29. Public Property Behälter As String
    30. <XmlElement(ElementName:="Ausbuchen", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=7)>
    31. Public Property Ausbuchen As String
    32. <XmlElement(ElementName:="Zeitstempel", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=8)>
    33. Public Property Zeitstempel As Nullable(Of Date)
    34. End Class
    35. End Namespace



    Alte Entität

    VB.NET-Quellcode

    1. Namespace EntitiesObsolet
    2. <Serializable(),
    3. DebuggerStepThrough(),
    4. DesignerCategory("code"),
    5. XmlType(AnonymousType:=True),
    6. XmlRoot(IsNullable:=False, ElementName:="VERW_DataSet")>
    7. Public Class VERW_DataSet
    8. Inherits List(Of VERW_Übersicht)
    9. End Class
    10. <Serializable(),
    11. DebuggerStepThrough(),
    12. DesignerCategory("code"),
    13. XmlType(AnonymousType:=True),
    14. XmlRoot(IsNullable:=False)>
    15. Public Class VERW_Übersicht
    16. <XmlElement(ElementName:="Datum", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=1)>
    17. Public Property Datum As String
    18. <XmlElement(ElementName:="Artikel", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=2)>
    19. Public Property Artikel As String
    20. <XmlElement(ElementName:="Bezeichnung", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=3)>
    21. Public Property Bezeichnung As String
    22. <XmlElement(ElementName:="Charge", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=4)>
    23. Public Property Charge As String
    24. <XmlElement(ElementName:="Menge", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=5)>
    25. Public Property Menge As String
    26. <XmlElement(ElementName:="Behälter", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=6)>
    27. Public Property Behälter As String
    28. <XmlElement(ElementName:="Ausbuchen", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=7)>
    29. Public Property Ausbuchen As String
    30. <XmlElement(ElementName:="Zeitstempel", Form:=Xml.Schema.XmlSchemaForm.Unqualified, Order:=8)>
    31. Public Property Zeitstempel As String
    32. End Class
    33. End Namespace



    Serializer

    VB.NET-Quellcode

    1. Private Sub Write(Data As Entities.VERW_DataSet, Filename As String)
    2. If Not Directory.Exists(Path.GetDirectoryName(Filename)) Then
    3. Directory.CreateDirectory(Path.GetDirectoryName(Filename))
    4. End If
    5. If File.Exists(Filename) Then
    6. File.Delete(Filename)
    7. End If
    8. Dim Serializer As XmlSerializer = New XmlSerializer(Data.GetType)
    9. Dim XStream As StreamWriter
    10. Dim EmptyNamespace As New XmlSerializerNamespaces()
    11. EmptyNamespace.Add("", "")
    12. Using FileStream As New FileStream(Filename, FileMode.Create)
    13. XStream = New StreamWriter(FileStream, Encoding.UTF8)
    14. Serializer.Serialize(XStream, Data, EmptyNamespace)
    15. FileStream.Close()
    16. End Using
    17. End Sub
    18. Private Sub Read(ByRef Data As Entities.VERW_DataSet, Filename As String)
    19. If File.Exists(Filename) Then
    20. Dim Serializer As XmlSerializer = New XmlSerializer(Data.GetType)
    21. Dim EmptyNamespace As New XmlSerializerNamespaces()
    22. EmptyNamespace.Add("", "")
    23. Using FileStream As New FileStream(Filename, FileMode.Open)
    24. Data = TryCast(Serializer.Deserialize(FileStream), Entities.VERW_DataSet)
    25. FileStream.Close()
    26. End Using
    27. End If
    28. End Sub
    29. Private Sub MigrateOldDate(FromFilePath As String, ToFilePath As String)
    30. Dim VERWOld As New EntitiesObsolet.VERW_DataSet
    31. Dim VERWNew As New Entities.VERW_DataSet
    32. Dim Serializer As XmlSerializer = New XmlSerializer(VERWOld.GetType)
    33. Dim EmptyNamespace As New XmlSerializerNamespaces()
    34. EmptyNamespace.Add("", "")
    35. Using FileStream As New FileStream(FromFilePath, FileMode.Open)
    36. VERWOld = TryCast(Serializer.Deserialize(FileStream), EntitiesObsolet.VERW_DataSet)
    37. FileStream.Close()
    38. End Using
    39. VERWNew = New Entities.VERW_DataSet
    40. VERWNew.AddRange(VERWOld.Select(Function(n) New Entities.VERW_Übersicht With {.Artikel = n.Artikel,
    41. .Datum = Convert.ToDateTime(n.Datum),
    42. .Ausbuchen = n.Ausbuchen,
    43. .Behälter = n.Behälter,
    44. .Bezeichnung = n.Bezeichnung,
    45. .Charge = n.Charge,
    46. .Menge = If(Integer.TryParse(n.Menge, Nothing), CInt(n.Menge),
    47. Nothing),
    48. .Zeitstempel =
    49. Convert.ToDateTime(n.Zeitstempel)}).ToList)
    50. Write(VERWNew, ToFilePath)
    51. End Sub



    Beispielform mit 3 Button einem Datagrid:

    Beispielform

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Imports System.Xml.Serialization
    4. Public Class frmVERWAnsicht
    5. Private VERW_DataSet As New Entities.VERW_DataSet
    6. Private Sub VERWAnsicht_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. FormatAccountansicht()
    8. End Sub
    9. Private Sub FormatAccountansicht()
    10. dgvVERW.Columns.Clear()
    11. dgvVERW.DataSource = Nothing
    12. dgvVERW.AutoGenerateColumns = False
    13. dgvVERW.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
    14. dgvVERW.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
    15. dgvVERW.AllowUserToResizeColumns = True
    16. dgvVERW.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
    17. dgvVERW.AllowUserToAddRows = False
    18. dgvVERW.AllowUserToDeleteRows = False
    19. dgvVERW.SelectionMode = DataGridViewSelectionMode.CellSelect
    20. dgvVERW.MultiSelect = False
    21. dgvVERW.ScrollBars = ScrollBars.Both
    22. dgvVERW.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Datum", .DataPropertyName = "Datum"})
    23. dgvVERW.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Artikel", .DataPropertyName = "Artikel"})
    24. dgvVERW.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Bezeichnung", .DataPropertyName = "Bezeichnung"})
    25. dgvVERW.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Charge", .DataPropertyName = "Charge"})
    26. dgvVERW.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Menge", .DataPropertyName = "Menge"})
    27. dgvVERW.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Behälter", .DataPropertyName = "Behälter"})
    28. dgvVERW.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Ausbuchen", .DataPropertyName = "Ausbuchen"})
    29. dgvVERW.Columns.Add(New DataGridViewTextBoxColumn With {.Name = "Zeitstempel", .DataPropertyName = "Zeitstempel"})
    30. With dgvVERW.Columns("Datum")
    31. .ReadOnly = False
    32. .Visible = True
    33. .Width = 120
    34. .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
    35. .HeaderText = "Datum"
    36. .SortMode = DataGridViewColumnSortMode.Automatic
    37. .DefaultCellStyle.Format = "dd.MM.yyyy HH:mm:ss"
    38. End With
    39. With dgvVERW.Columns("Artikel")
    40. .ReadOnly = False
    41. .Visible = True
    42. .Width = 240
    43. .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
    44. .HeaderText = "Artikel"
    45. .SortMode = DataGridViewColumnSortMode.Automatic
    46. End With
    47. With dgvVERW.Columns("Bezeichnung")
    48. .ReadOnly = False
    49. .Visible = True
    50. .Width = 120
    51. .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
    52. .HeaderText = "Bezeichnung"
    53. .SortMode = DataGridViewColumnSortMode.Automatic
    54. End With
    55. With dgvVERW.Columns("Charge")
    56. .ReadOnly = False
    57. .Visible = True
    58. .Width = 120
    59. .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
    60. .HeaderText = "Charge"
    61. .SortMode = DataGridViewColumnSortMode.Automatic
    62. End With
    63. With dgvVERW.Columns("Menge")
    64. .ReadOnly = False
    65. .Visible = True
    66. .Width = 120
    67. .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
    68. .HeaderText = "Menge"
    69. .SortMode = DataGridViewColumnSortMode.Automatic
    70. End With
    71. With dgvVERW.Columns("Behälter")
    72. .ReadOnly = False
    73. .Visible = True
    74. .Width = 120
    75. .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
    76. .HeaderText = "Behälter"
    77. .SortMode = DataGridViewColumnSortMode.Automatic
    78. End With
    79. With dgvVERW.Columns("Ausbuchen")
    80. .ReadOnly = False
    81. .Visible = True
    82. .Width = 120
    83. .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
    84. .HeaderText = "Ausbuchen"
    85. .SortMode = DataGridViewColumnSortMode.Automatic
    86. End With
    87. With dgvVERW.Columns("Zeitstempel")
    88. .ReadOnly = False
    89. .Visible = True
    90. .Width = 120
    91. .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
    92. .HeaderText = "Zeitstempel"
    93. .SortMode = DataGridViewColumnSortMode.Automatic
    94. .DefaultCellStyle.Format = "dd.MM.yyyy HH:mm:ss"
    95. End With
    96. End Sub
    97. Private Sub Write(Data As Entities.VERW_DataSet, Filename As String)
    98. If Not Directory.Exists(Path.GetDirectoryName(Filename)) Then
    99. Directory.CreateDirectory(Path.GetDirectoryName(Filename))
    100. End If
    101. If File.Exists(Filename) Then
    102. File.Delete(Filename)
    103. End If
    104. Dim Serializer As XmlSerializer = New XmlSerializer(Data.GetType)
    105. Dim XStream As StreamWriter
    106. Dim EmptyNamespace As New XmlSerializerNamespaces()
    107. EmptyNamespace.Add("", "")
    108. Using FileStream As New FileStream(Filename, FileMode.Create)
    109. XStream = New StreamWriter(FileStream, Encoding.UTF8)
    110. Serializer.Serialize(XStream, Data, EmptyNamespace)
    111. FileStream.Close()
    112. End Using
    113. End Sub
    114. Private Sub Read(ByRef Data As Entities.VERW_DataSet, Filename As String)
    115. If File.Exists(Filename) Then
    116. Dim Serializer As XmlSerializer = New XmlSerializer(Data.GetType)
    117. Dim EmptyNamespace As New XmlSerializerNamespaces()
    118. EmptyNamespace.Add("", "")
    119. Using FileStream As New FileStream(Filename, FileMode.Open)
    120. Data = TryCast(Serializer.Deserialize(FileStream), Entities.VERW_DataSet)
    121. FileStream.Close()
    122. End Using
    123. End If
    124. End Sub
    125. Private Sub MigrateOldDate(FromFilePath As String, ToFilePath As String)
    126. Dim VERWOld As New EntitiesObsolet.VERW_DataSet
    127. Dim VERWNew As New Entities.VERW_DataSet
    128. Dim Serializer As XmlSerializer = New XmlSerializer(VERWOld.GetType)
    129. Dim EmptyNamespace As New XmlSerializerNamespaces()
    130. EmptyNamespace.Add("", "")
    131. Using FileStream As New FileStream(FromFilePath, FileMode.Open)
    132. VERWOld = TryCast(Serializer.Deserialize(FileStream), EntitiesObsolet.VERW_DataSet)
    133. FileStream.Close()
    134. End Using
    135. VERWNew = New Entities.VERW_DataSet
    136. VERWNew.AddRange(VERWOld.Select(Function(n) New Entities.VERW_Übersicht With {.Artikel = n.Artikel,
    137. .Datum = Convert.ToDateTime(n.Datum),
    138. .Ausbuchen = n.Ausbuchen,
    139. .Behälter = n.Behälter,
    140. .Bezeichnung = n.Bezeichnung,
    141. .Charge = n.Charge,
    142. .Menge = If(Integer.TryParse(n.Menge, Nothing), CInt(n.Menge),
    143. Nothing),
    144. .Zeitstempel =
    145. Convert.ToDateTime(n.Zeitstempel)}).ToList)
    146. Write(VERWNew, ToFilePath)
    147. End Sub
    148. Private Sub BtnImport_Click(sender As Object, e As EventArgs) Handles BtnImport.Click
    149. Read(VERW_DataSet, Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "VERWDataSet", "VERW.xml"))
    150. dgvVERW.DataSource = Nothing
    151. dgvVERW.DataSource = VERW_DataSet
    152. End Sub
    153. Private Sub BtnExport_Click(sender As Object, e As EventArgs) Handles BtnExport.Click
    154. Write(VERW_DataSet, Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "VERWDataSet", "VERW.xml"))
    155. End Sub
    156. Private Sub BtnNew_Click(sender As Object, e As EventArgs) Handles BtnNew.Click
    157. If VERW_DataSet Is Nothing Then
    158. VERW_DataSet = New Entities.VERW_DataSet
    159. End If
    160. VERW_DataSet.Add(New Entities.VERW_Übersicht)
    161. dgvVERW.DataSource = Nothing
    162. dgvVERW.DataSource = VERW_DataSet
    163. End Sub
    164. End Class



    Die Methode um die Dateien in ein neues Verzeichnis zu Migrieren habe ich dir bereits geschrieben. Wird aus der Beispielform aber nicht aufgerufen, da ich keine Testdaten habe. Musst du dann selbst ausprobieren.

    Die Klasse ist eine generische Liste. Dementsprechend kannst du alle Elemente per LINQ / Lambda-Expressions filtern und sortieren. Viel Spaß!


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Yanbel“ ()