Zum Inhalt springen

C# .NET Dataset


Loewchen0507

Empfohlene Beiträge

Ich schon wieder,

ist eigentlich nur eine kurze Frage.

Ich möchte aus zwei Datenbanken die Daten vergleichen bzw. aktuallisieren.

Nun meine Frage:

Welche der folgenden Varianten ist schneller?

1. Die Daten in per Dataset speichern, vergleichen und nur die unterschiedlichen Datensätze aktualisieren?

2. Die Daten nicht in ein Dataset laden sondern direkt vergleichen und den jeweiligen Datensatz aktualisieren?

2. oder ein SQL Statement für die Aktualisierung aller Datensätze los zu schicken, egal ob unterschiedlich oder nicht?

Freue mich schon auf antworten.

LG Loewchen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

es handelt sich um ca. 10.000 Adress-Datensätze. Die Tabellen sind ähnlich aber nicht identisch.

Ich habe mich gestern noch ein bisschen belesen zu Datasets. Habe etwas über Merge gelesen, was bei mir aber nicht in Frage kommt, da ich zwar mit ein paar geschickten Select Abfragen die Tabellen ähnlich gestalten kann aber zumindest den Key bekomme ich nicht identisch hin.

Ich habe noch etwas gelesen über Datasets die man als XML im Arbeitsspeicher oder auch auf dem Rechner sichern kann um dann damit weiter arbeiten zu können. Nur bei 10.000 Datensätzen ist die Frage was hier wirklich sinnvoll ist. Bei dieser Menge an Daten möchte ich auch nicht den ersten Datensatz nehmen dann die andere Tabelle durchgehen und gucken bis ich den passenden Datensatz gefunden habe, ihn dann vergleichen und gegebenenfalls dann ändern oder hinzufügen. Das dauert doch viel zu lang.

Ich bin mit meiner Planung hier noch nicht wirklich zufrieden. Hoffe Ihr habt hier noch ein paar super Ideen.

LG Loewchen

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.


            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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn die Datensätze anhand der ID identisch sind, würde ich den DataAdapter verwenden. Dann würde ich in ein DataSet laden und Mergen. Anhand der ID, wird dann abgeglichen. Danach das DataSet einfach wieder mit dem Update-Befehl des Adapters wieder in die zu Aktualisierende Datenbank schreiben.

Leider habe ich noch keinen Geschwindigkeitsvergleich gemacht.

Andere Vorschläge interessieren mich auch ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...