Announcement

Collapse
No announcement yet.

Vergleich von Daten aus zwei Datenbanken

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

  • Vergleich von Daten aus zwei Datenbanken

    Hi,

    ich bin nochziemlich frisch in der .NET Klamotte und bin momentan ziemlich am verzweifeln.

    Folgende Aufgabenstellung:
    Ich möchte auf Daten von zwei verschiedenen Programmen zugriefen. Das eine Programm basiert auf einer Access Datenbank und das andere auf einer SQLDatenbank. Beide Datenbanken haben eine Tabelle mit Adressdaten. Ich möchte nun diese Daten vergleichen und aktualisieren. Dazu habe ich progrämmchen geschrieben. Dieses Programm kann ich konfigurieren. Ich kann so einstellen welche Daten ich aktualisieren möchte und die Verbindungsdaten angeben. Soweit alles wunderbar.

    Meine Herangehensweise:
    Ich stelle die Datenbankverbindungen zu den jeweiligen Datenbanken her.
    Ich ziehe mir die Daten in ein DataSet.
    Dann schaue ich für jedenDatensatz nach, ob dieser in der zu aktualisierenden Tabelle vorhanden ist oder nicht.
    Ist er nicht vorhanden erzeuge ich einen neuen Datensatz.
    Ist er vorhanden schaue ich ob es unterschiede gibt.
    Sind Unterschiede vorhanden aktualisiere ich die Daten.
    Sind keine Unterschiede vorhanden mache ich mit dem nächsten Datensatz weiter.

    Mein bisher erreichtes Ziel:
    Ich habe ein Programm mit dem ich die Konfiguration ändern kann.
    Anhand dieser Konfigurationen wird eine Verbindung zur Access datenbank mit OleDb aufgebaut und zum SQL Server mit ODBC.
    Dann erzeuge ich ein SQLDataAdapter, ein OleDbCommand, ein OdbcCommand und jeweils ein Dataset.

    Das ganze sieht dann so aus:
    Code:
                    if (SQLconn.State == ConnectionState.Open && AccessConn.State == ConnectionState.Open)
                    {
                        // SQLDataAdapter erzeugen für Cobra Tabelle und für W und C
                        SqlDataAdapter CAdapter = new SqlDataAdapter();
                        SqlDataAdapter WAdapter = new SqlDataAdapter();
    
                        // Tabelle erstellen mit Namen Cobra und WinLine
                        CAdapter.TableMappings.Add("Table", "C");
                        WAdapter.TableMappings.Add("Table", "W");
    
                        // Commands zum auslesen und schreiben in Tabelle
                        OleDbCommand Command = new OleDbCommand("Select * from Adresses", AccessConn);
                        OdbcCommand Wcommand = new OdbcCommand("Select * From dbo.t055", SQLconn);
                        CCommand.CommandType = CommandType.Text;
                        Wcommand.CommandType=CommandType.Text;
    
                        // DataSet füllen
                        DataSet CDs = new DataSet("C");
                        DataSet WDs = new DataSet("W");
                        CAdapter.Fill(CDs);
                        WAdapter.Fill(WDs);
    
                        DataTableReader CobraReader = CobraDs.CreateDataReader();
                        do
                        {
                            // CobraReader
                        } while (CobraReader.NextResult());
    
                        DataTableReader WinLineReader = WinLineDs.CreateDataReader();
                        do
                        {
                            // WinLineReader
                        } while (WinLineReader.NextResult());
    }
    Wie man sieht habe ich auch schon die DataReader. Aber ich habe keine Ahnung wie ich weiter vorgehen soll... Gibts es nicht irgend eine Möglichkeit zwei Datasets miteinander zu vergleichen? Und die Unterschiede in einem DatSet anzupassen und das DataSet dann zurückzuspielen? Oder gehe ich die Sache Komplett falsch an?

    Ich hoffe Ihr könnt mir helfen... Bin für jede Anregung dankbar.

    LG Loewchen

  • #2
    Hallo,

    welche Version des .NET Framework (1.x oder 2.0) bzw. welche IDE wird verwendet? Im Fall von .NET 2.0 (Visual Studio 2005) erübrigen die TableAdapter die mühsame Handarbeit beim Eintippen der Programmzeilen. Wenn die Daten nur in eine Richtung aktualisiert werden sollen und die Tabellen aus beiden Datenbanken den gleichen Primärschlüssel verwendet, kann die Merge-Methode des DataSets für das Zusammenmischen verwendet werden. Im einfachsten Fall (TableAdapter) besteht das Programm dann nur aus einer von Hand geschriebenen Programmzeile.

    Demnächst werden die Microsoft Synchronization Services for ADO.NET (die es momentan nur als CTP gibt) verfügbar sein, die derartige Anforderungen über ein vordefiniertes Framework besser unterstützen (denn in der Praxis reicht die Merge-Abkürzung für die Anforderungen vermutlich nicht aus).

    Comment


    • #3
      Hi,

      ja ich verwende Visual Studio 2005 und habe mir gestern sogar schon Framework 3.0 runter geladen.

      Die Tabellen sind zwar ähnlich aber dennoch ziemlich unterschiedlich und haben auch unterschiedliche Primärschlüssel. Mit einer geschickten select Abfrage kann ich die Tabellen soweit angleichen, dass nahezu identisch sind. Nur die Sache mit dem Key... da fällt mir zumindest auf anhieb nichts ein.

      Ich habe gestern Abend noch ein bisschen gelesen und dabei habe ich gesehen, dass man Datasets als XML im Arbeitsspeicher oder als Datei sichern kann um dann damit zu arbeiten.

      Da es sich bei mir aber um ca. 10.000 Datensätze handelt die verglichen und gegebenenfalls geändert werden sollen ist die Frage, welche Vorgehensweise am schnellsten ist?.

      Liebe Grüße Loewchen

      Comment


      • #4
        Lösung gefunden

        Hi,

        Falls es jemanden interessiert poste ich hier mal ein stückchen Code von mir.
        Vielleicht kann es ja mal jemand gebrauchen.

        Falls jemand einen Kommentar dazu abgeben möchte, Verbesserungsvorschläge hat oder oder oder dann immer her damit... ich bin noch am lernen und bin für jede konstruktive Kritik zu haben.

        Code:
        Code:
                    try
                    {
                        // Deklaration
                        Boolean Update = false;
                        String UpdateStatement = "";
                        String SQLConnStr = "";
                        String AccessConStr = "";
                        OdbcConnection SQLconn;
                        OleDbConnection AccessConn;
                        OdbcCommand SQLCommand;
                        OleDbCommand AccessCommand;
                        OdbcDataReader SQLreader;
                        OleDbDataReader AccessReader;
                        int Richtung = 0;
        
                        // Initialisierung
                        // SQL Connectionstring und Connection
                        SQLConnStr = "Driver={SQL Server};Server=" + Properties.CoWi.Default.SQLServer + ";Database=" + Properties.CoWi.Default.SQLDB +
                                     ";UID=" + Properties.CoWi.Default.SqlUser + ";PWD=" + Properties.CoWi.Default.SQLPWD + ";";
                        SQLconn = new OdbcConnection(SQLConnStr);
                        // AccessConnectionString und Connection
                        AccessConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Properties.CoWi.Default.AccesDB;
                        AccessConn = new OleDbConnection(AccessConStr);
                        // Richtung / 1 = ACCESS -> SQL / 2 = SQL -> ACCESS
                        Richtung = Properties.CoWi.Default.Richtung;
        
                        // Verbindungsaufbau zum SQL Server
                        SQLconn.Open(); // Verbindung öffnen
                        // Verbindungsaufbau zur Access Datenbank
                        AccessConn.Open(); // Connection öffnen
        
                        if (SQLconn.State == ConnectionState.Open && AccessConn.State == ConnectionState.Open)
                        {
                            if (Richtung == 1) // MDB -> SQL
                            {
                                // Command zum auslesen und vergleichen
                                AccessCommand = new OleDbCommand("Select <Spalten> from <Tabelle>", AccessConn);
                                AccessCommand.CommandType = CommandType.Text;
        
                                // MDB Reader
                                AccessReader = AccessCommand.ExecuteReader();
                                do
                                {
                                    // Command zum auslesen und vergleichen (WinLine)
                                    // Select Anweisung anpassen auf EINEN DATENSATZ
                                    SQLCommand = new OdbcCommand("Select <Spalten> From <Tabelle>", SQLconn);
                                    SQLCommand.CommandType = CommandType.Text;
        
                                    // SQL Reader
                                    SQLreader = SQLCommand.ExecuteReader();
        
                                    if (SQLreader.HasRows) // Datensatz vorhanden
                                    {
                                        //vergleiche Datensätze
                                        for (int i = 0; i < 20; i++)
                                        {
                                            if (AccessReader[i].ToString() != SQLreader[i].ToString())
                                            {
                                                UpdateStatement = UpdateStatement + "<Spalte> = <Wert>";
                                                Update = true;
                                            }
                                        }
        
                                        if (Update)
                                        {
                                            SQLCommand.CommandText = "Update <Tabelle> SET " + UpdateStatement + " WHERE <Bedingung>;";
                                            SQLCommand.ExecuteNonQuery();
                                        }
                                    }
                                    else // Datensatz ist nicht vorhanden
                                    {
                                        // Füge Datensatz hinzu
                                        // SQL anpassen
                                        SQLCommand.CommandText = "INSERT INTO <Tabelle>(Spalte1, Spalte2, ... , SpalteN)" +
                                                                 "VALUES (<Wert1>, <Wert2>, ... , WertN);";
                                        SQLCommand.ExecuteNonQuery();
                                    }
        
                                    // SQLReader Schließen
                                    SQLreader.Close();
        
                                } while (AccessReader.NextResult());
        
                                // AccessReader Schließen
                                AccessReader.Close();
                            }
                            else // SQL -> MDB
                            {
                            }
                        }
                        else
                        {
                            EventLog myEventLog = new EventLog();
                            myEventLog.Source = "CoWiSource";
        
                            if (SQLconn.State == ConnectionState.Open)
                            {
                                myEventLog.WriteEntry("Verbindung zur AccessDatenbank konnte nicht aufgebaut werden");
                            }
                            else
                            {
                                myEventLog.WriteEntry("Verbindung zur SQLServerDatenbank konnte nicht aufgebaut werden");
                            }
                        }
        
                        SQLconn.Close();
                        AccessConn.Close();
                    }
                    catch (Exception ex)
                    {
                        // Anweisungen 
                        DateTime Time;
                        Time = DateTime.Now;
                        string Project = "";
                        StreamWriter writer;
        
                        MessageBox.Show("Ein Fehler ist aufgetreten. Bitte überprüfen Sie Ihre Einstellungen in der Konfiguration. \n" + ex.Data.ToString() + "\n" + ex.Message.ToString() + "\n" + ex.TargetSite.ToString(),
                        "Exception",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error,
                        MessageBoxDefaultButton.Button2);
        
                        Project = Path.GetFullPath("CoWi-Dienst.exe");
                        Project = Project.Substring(0, Project.Length - 15) + "Exception.txt";
                        // Ist datei nicht vorhanden wird sie erzeugt und gefüllt
                        if (!File.Exists(Project))
                        {
                            // Datei wird erzeugt
                            using (StreamWriter sw = File.CreateText(Project))
                            {
                                sw.WriteLine(Time + "  Exception");
                                sw.WriteLine(Time + "  " + ex.Data.ToString());
                                sw.WriteLine(Time + "  " + ex.Message.ToString());
                                sw.WriteLine(Time + "  " + ex.Source.ToString());
                                sw.WriteLine(Time + "  " + ex.TargetSite.ToString());
                                sw.Close();
                            }
                        }
                        // Ist sie vorhanden wird der Inhalt der Datei gesichert (helper)
                        // und in die neue Datei geschrieben
                        // dann erst wird alles neue angefügt
                        else
                        {
                            String helper = "";
                            helper = File.ReadAllText(Project);
                            writer = File.CreateText(Project);
                            writer.WriteLine(helper);
                            writer.WriteLine(Time + "  Exception");
                            writer.WriteLine(Time + "  " + ex.Data.ToString());
                            writer.WriteLine(Time + "  " + ex.Message.ToString());
                            writer.WriteLine(Time + "  " + ex.Source.ToString());
                            writer.WriteLine(Time + "  " + ex.TargetSite.ToString());
                            writer.Close();
                        }
                    }
                    finally
                    {
                        // Abschlussarbeiten 
                    }
                }
        LG Loewchen

        Comment

        Working...
        X