Loewchen0507 Geschrieben 23. April 2007 Teilen Geschrieben 23. April 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigpoint Geschrieben 23. April 2007 Teilen Geschrieben 23. April 2007 direkt auf dem Server es zu tun in einem SQL Statement ist die schnellste Variante. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Loewchen0507 Geschrieben 23. April 2007 Autor Teilen Geschrieben 23. April 2007 Hi, Von SQL nach MDB OK??? Aber von MDB nach SQL??? außerdem habe ich nicht die Möglichkeit auf dem SQLServer solche Änderungen vorzunehmen. Ich will es per Code machen. Gruß Loewchen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigpoint Geschrieben 24. April 2007 Teilen Geschrieben 24. April 2007 2. Die Daten nicht in ein Dataset laden sondern direkt vergleichen und den jeweiligen Datensatz aktualisieren? Was verstehst du unter direkt vergleichen ? Von SQL nach MDB OK??? Aber von MDB nach SQL??? Sowohl auch, sehe überhaupt kein Problem. Um wie viel Datensätze handelt es sich? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Loewchen0507 Geschrieben 24. April 2007 Autor Teilen Geschrieben 24. April 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Loewchen0507 Geschrieben 24. April 2007 Autor Teilen Geschrieben 24. April 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Chr!st!an Geschrieben 30. April 2007 Teilen Geschrieben 30. April 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.