none
DataTable - Abfrage, ob Datensatz vorhanden RRS feed

  • Frage

  • Hallo zusammen,

      in einer Einzelplatzanwendung verwalte ich Daten in einer DataTable, abgespeichert als XML-Datei (nicht verknüpft mit einer Datenbank).

      Nun gibt es die Situation, dass ich einen Datensatz nur dann hinzufügen möchte, wenn er noch nicht vorhanden ist. Hierfür sehe ich drei mögliche Ansätze:

      Ich definiere die entsprechende Spalte als "Unique". Wird dann versucht, einen Datensatz doppelt einzugeben, müsste ich die Exception abfangen. Dieses Vorgehen erscheint mir etwas "unsauber".

      Zweite Möglichkeit: Ich frage über eine DataView und einen entsprechenden Filter ab, ob es den Datensatz schon gibt.

      Ditte Option: LINQ -  http://msdn.microsoft.com/de-de/library/bb552415.aspx

      Welche Möglichkeit würdet ihr favorisieren?

    Gruß,

    Matthias
    Sonntag, 12. Dezember 2010 12:33

Antworten

  • Hallo Matthias,

    Ein UniqueConstraint beim Insert/Update zusammen mit einem weise benutzten EnforceConstraints (vor ReadXml auf false setzen wenn Du die volle Kontrolle über die XML-Datei hast) sollte m.E. eine gute Performanz bringen. Wenn für die Spalte unique gesetzt ist, wird beim Versuch, den Wert für die Spalte zu setzen, intern einfach ein Sortierungsindex überprüft, was den Vorgang sehr effizient macht. Der einzige Knackpunkt ist die geworfene Ausnahme, die schon etwas kostet. Da mußt Du selber abwägen, was - angesichts der Datenmenge und Insert/Update-Häufigkeit - am sinnvollsten ist.

    Arbeiten mit Datasets in Visual Studio
    http://msdn.microsoft.com/de-de/library/8bw9ksd6(v=VS.100).aspx

    Gruß
    Marcel

    Sonntag, 12. Dezember 2010 17:03
    Moderator
  • Hallo Matthias,

    wenn die Anforderung nur ist, dass beim "Einfügen" keine doppelten entstehen sollen, ist IMHO eher auch beim Insert einzuhaken.
    Es ist dann der direkteste Weg ohne Exceptions. Mit Exceptions ist es im Prinzip nur dann unsauber (gem. "dont use exceptions to control flow"), wenn es ein ~häufig erwartetes Ereignis ist, dass eine Exception auftritt.

    Zum Teil ist ein "override" von SubmitChanges ein gutes Vorgehen, aber man sollte sich auch klar machen, dass eine Durchsuchung eines DataTable ggf. etwas anderes ist, als schon deren DefaultView zu beschränken. Im View (der Sicht) können ja ggf. schon neue Zeilen hinzukommen, die aber noch nicht in der Tabelle sind. Lange Rede - ich denke, der View ist schon das richtige Objekt. Zum Beispiel gibt es auch das BindingSource.AddingNew Ereignis. Das wäre auch sehr geeignet, wenn Du darin die Uniqueness abprüfst.

    Also - eine "klare" Empfehlung gibt es da so IMHO nicht, sondern nur Varianten, die mehr oder weniger in Deine sonstige Architektur und Anforderungen passen. BTW: Exceptions kosten nur das erste Mal (im Debug) recht viel Performance, danach sind sie recht schnell.


    ciao Frank
    Sonntag, 12. Dezember 2010 20:20

Alle Antworten

  • Hallo Matthias,

    Ein UniqueConstraint beim Insert/Update zusammen mit einem weise benutzten EnforceConstraints (vor ReadXml auf false setzen wenn Du die volle Kontrolle über die XML-Datei hast) sollte m.E. eine gute Performanz bringen. Wenn für die Spalte unique gesetzt ist, wird beim Versuch, den Wert für die Spalte zu setzen, intern einfach ein Sortierungsindex überprüft, was den Vorgang sehr effizient macht. Der einzige Knackpunkt ist die geworfene Ausnahme, die schon etwas kostet. Da mußt Du selber abwägen, was - angesichts der Datenmenge und Insert/Update-Häufigkeit - am sinnvollsten ist.

    Arbeiten mit Datasets in Visual Studio
    http://msdn.microsoft.com/de-de/library/8bw9ksd6(v=VS.100).aspx

    Gruß
    Marcel

    Sonntag, 12. Dezember 2010 17:03
    Moderator
  • Hallo Matthias,

    wenn die Anforderung nur ist, dass beim "Einfügen" keine doppelten entstehen sollen, ist IMHO eher auch beim Insert einzuhaken.
    Es ist dann der direkteste Weg ohne Exceptions. Mit Exceptions ist es im Prinzip nur dann unsauber (gem. "dont use exceptions to control flow"), wenn es ein ~häufig erwartetes Ereignis ist, dass eine Exception auftritt.

    Zum Teil ist ein "override" von SubmitChanges ein gutes Vorgehen, aber man sollte sich auch klar machen, dass eine Durchsuchung eines DataTable ggf. etwas anderes ist, als schon deren DefaultView zu beschränken. Im View (der Sicht) können ja ggf. schon neue Zeilen hinzukommen, die aber noch nicht in der Tabelle sind. Lange Rede - ich denke, der View ist schon das richtige Objekt. Zum Beispiel gibt es auch das BindingSource.AddingNew Ereignis. Das wäre auch sehr geeignet, wenn Du darin die Uniqueness abprüfst.

    Also - eine "klare" Empfehlung gibt es da so IMHO nicht, sondern nur Varianten, die mehr oder weniger in Deine sonstige Architektur und Anforderungen passen. BTW: Exceptions kosten nur das erste Mal (im Debug) recht viel Performance, danach sind sie recht schnell.


    ciao Frank
    Sonntag, 12. Dezember 2010 20:20