Announcement

Collapse
No announcement yet.

DataSet vergleichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataSet vergleichen

    Frohes neues Jahr euch allen
    Ich habe folgendes Problem. Ich erstelle an verschiedenen Stellen DataSet's. Jetzt möchte ich gerne rauskriegen, ob die Inhalte der Tabelle an der Stelle [0] gleich sind. Also die gleichen Zeilen enthalten sind. Gibt es dafür eine einfache Möglichkeit. Über equals gehts ja nicht, da dort ja die Objekte verglichen werden.

    Vielen Dank,
    Matze

  • #2
    Hallo,

    ich habe gerade unter http://www.mycsharp.de die Suchfunktion bemüht. Dort gab es eine Reihe von Diskussionen, aber keine richtige Lösung.

    Du könntest im ersten Schritt zwei Tabellen, die Du vergleichen willst, per Merge() zusammenführen und die Anzahl der Zeilen vergleichen. Prüfe dazu auch die möglichen Parameter dieser Methode.

    Im zweiten Schritt könntest Du DataViews mit gleicher Sortierung auf die Tabellen legen und in einer kombinierten Schleife beide Tabellen parallel durchgehen.

    Für weitere Prüfungen wäre Deine Definition von "die gleichen Zeilen enthalten" wichtig. Geht es um gleiche PrimaryKeys oder um vollständig identische Zeilen?

    Ebenso frohes Neues Jahr! Jürgen

    Comment


    • #3
      Hi Jürgen, danke für die Neujahrswünsche.
      Es geht tatsächlich um vollständige Gleichheit der Abrageergebnisse. Ich werde jetzt erstmal über den Vorschlag mit dem Merge() nachdenken.
      Primärschlüssel sind dabei nicht von Bedeutung, sondern die restlichen Ergebnisse der Abfrage. Also z.B.: Liefern zwei Abfragen, die unterschiedliche Where Klauseln besitzen die gleichen Ergebnismengen??! Dazu sollen die Ergebniszeilen der Abrage verglichen werden.
      Danke erstmal!

      Comment


      • #4
        Hallo matze83,

        ich habe so etwas mal selbst programmiert - relativ rudimentär- aber es funktioniert. Einziges Problem: Die Sortierreihenfolge der Rows wird nicht beachtet -> inhaltlich sind die DataSets aber gleich.

        public static class CompareDataSets
        {
        #region Public Methods
        public static bool AreEqual(DataSet ds1, DataSet ds2)
        {
        bool result = true;
        if (ds1.Tables.Count != ds2.Tables.Count)
        {
        result = false;
        }
        else
        {
        for (int i = 0; i < ds1.Tables.Count; i++)
        {
        DataTable dt1 = ds1.Tables[i];
        DataTable dt2 = ds2.Tables[i];

        if (!(TablesEqual(dt1, dt2)))
        {
        result = false;
        break;
        }
        }
        }

        return result;
        }
        #endregion

        #region Private Methods
        private static bool RowsEqual(DataRow dr1, DataRow dr2)
        {
        object[] arr1 = dr1.ItemArray;
        object[] arr2 = dr2.ItemArray;

        bool result = true;
        for (int i = 0; i < arr1.Length; i++)
        {
        if (!(arr1[i].Equals(arr2[i])))
        {
        result = false;
        break;
        }
        }
        return result;
        }

        private static bool TablesEqual(DataTable dt1, DataTable dt2)
        {
        bool result = true;

        if (dt1.Columns.Count != dt2.Columns.Count)
        {
        result = false;
        }
        else
        {
        if (dt1.Rows.Count != dt2.Rows.Count)
        {
        result = false;
        }
        else // Count Rows and Columns are equal
        {
        for (int i = 0; i < dt1.Rows.Count; i++)
        {
        DataRow dr1 = dt1.Rows[i];
        DataRow dr2 = dt2.Rows[i];

        if (!(RowsEqual(dr1, dr2)))
        {
        result = false;
        break;
        }
        }
        }
        }
        return result;
        }

        #endregion
        }

        Gruß, Michael

        Comment


        • #5
          Moin,
          ich habe jetzt eine Lösung implementiert, welche Michaels sehr ähnlich ist. Funktioniert so weit auch. Dieser Vergleich wird allerdings sehr oft aufgerufen. Durch einen Profiler habe ich herausgefunden, dass
          Code:
          object[] arr1 = dr1.ItemArray;
          einen Großteil der Laufzeit des PRogramms beansprucht....
          Alternativ habe ich die Strings, die ich per GetXML bekomme, verglichen. Dann wirds noch langsamer. Und auch wenn ich ein Merge der Tabellen der DAtaSets mache und schaue, ob Spalten hinzugekommen sind, leidet die Laufzeit auch zusätzlich. Hat jemand einen Tipp, wie ich die Performanz verbessern kann??
          Ich wäre sehr dankbar.
          Gruß,
          Matze

          Comment

          Working...
          X