Also ich versuch mal mein Problem zu schildern: Ich habe ein Dataset
und vor einiger Zeit wurde das Dataset in eine XML Datei gespeichert
(WriteXml). Nun wurde das Program erweitert und korrigiert. Dabei
wurden dem Dataset nun auch ForeignKeys (ForeignConstraints)
hinzugefügt.
Da die Daten in der Xml Datei nun aber gegen diese Constraints
verstoßen bekomme ich beim einlesen mit Hilfe von ReadXml eine
ConstraintsException. Vorrübergehend schalt ich daher die Prüfung mit
EnforceConstraints = False aus und nach dem einlesen wieder ein. Dabei
werden alle Reihen mit dem HasError Tag markiert und eine
contraintsException ausgelöst. Binde ich die Datatable an ein Datagrid
werden mir die Fehlerhaften Reihen auch angezeigt.
Nun ist es bei mehreren Tausend Datensätzen etwas umständlich alle
Fehlerhaften Datensätze mit der Hand abzuändern. Von daher möchte
ich gern die Möglichen Fehler durch Programmcode beheben (Im
Beispielcode der auskommendierte bereich)
Leider scheint beim ReadXml die ColumnError Tags nicht gefüllt zu
werden. Die Function row.GetColumnsInError() gibt 0 Zeilen zurück.
Wie bekomme ich die Column oder den Constraits der den Fehler
verursacht hat damit ich den Eintrag berichtigen oder löschen kann.
Try
speicher.EnforceConstraints = False
speicher.ReadXml(Application.StartupPath & " \Database\" &
webs.Auswahl & "\data.xml", XmlReadMode.InferSchema)
speicher.EnforceConstraints = True
Catch ex As ConstraintException
For Each tab As DataTable In speicher.Tables
If tab.HasErrors Then
Dim test() As DataRow = tab.GetErrors
For Each row As DataRow In test
If row.HasErrors Then
MsgBox(row.RowError) 'Fehler wird angezeigt
'Meldung: Für ForeignKeyContraint FKArtikelnummer müssen die
untergeordneten Schlüsselwerte (62) in der übergeordneten Tabelle
vorhanden sein.
MsgBox(row.GetColumnsInError.Length) '0 wird
zurückgegeben.
End If
'For Each col As DataColumn In cols
' Select Case tab.TableName
' Case "Artikel"
' Select Case col.Caption
' Case "KatID2"
' row("KatID2") = DBNull.Value
' row.AcceptChanges()
' Case "KatID3"
' row("KatID3") = DBNull.Value
' row.AcceptChanges()
' End Select
' Case "Bilder"
' Select Case col.Caption
' Case "Artikelnummer"
' bilddatei.Delete(row("BildID"))
' row.Delete()
' End Select
' End Select
'Next
Next
End If
Next
End Try
|