none
2 Datenbanken auf 2 verschiedenen Servern synchronisieren RRS feed

  • Frage

  • Hallo zusammen,

    ich habe folgendes Problem.

    Ich habe 2 Datenbanken. Einmal die Datenbank TABLET und einmal die Datenbank SERVER. Beide Datenbanken sind vom Aufbau identisch. In meiner Anwendung fülle ich nur die Datenbank TABLET mit Daten. Nun möchte ich die Datenbank SERVER mit der Datenbank Tablet synchronisieren. Nehmen wir das eine Beispieltabelle namens Test.

    Wie mache ich das?

    ich brauche 2 Connections.

    Dim cnnTablet as OleDbConnection

    Dim cnnServer as OleDbConnection

    nur wie mache ich weiter. 

    Dienstag, 6. Mai 2014 11:11

Antworten

  • Hi,

    doch, könntest Du schon. Aber nicht so, wie Du dir das vorstellst :)

    Letztendlich kannst Du natürlich die Daten aus Connection 1 bspw. in eine DataTable oder eine DataReader laden, diesen dann durchlaufen und für jede Zeile ein INSERT INTO Statement mit den entsprechenden Parametern erzeugen und das gegen Connection 2 absetzen.

    Also in etwa so:

    Dim SourceTable As DataTable
        <LadeDatenInSourceTable>
    
        For Each Row As DataRow in SourceTable.Rows
    
        Dim SqlStatement As String
            SqlStatement = "INSERT INTO Tabelle( Spalte1, Spalte2 ) VALUES( @Wert1, @Wert2 )"
    
        Dim SqlCommand As New SqlCommand( SqlStatement )
            SqlCommand.Parameters.AddWithValue( "@Wert1",    Row( "Spalte1" ) )
            SqlCommand.Parameters.AddWithValue( "@Wert2",    Row( "Spalte2" ) )
    
            SqlCommand.Connection = Connection2
            SqlCommand.ExecuteNonQuery()
    
        Next
    
    Das ist jetzt nur schnell dahingeschrieben und sicherlich optimierungswürdig :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Robbo1984 Mittwoch, 7. Mai 2014 10:23
    Dienstag, 6. Mai 2014 13:33
    Moderator
  • Egal für welche Variante sich hier entschieden wird, rate ich dringend, keinen (Verbindungs-)Servernamen im Anwendungscode zu hinterlegen.

    Mindestens mit Synonymen, besser mit einer gespeicherten Prozedur + Synonym arbeiten. Ansonsten sind graue Haare vorprogrammiert.


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    • Als Antwort markiert Robbo1984 Mittwoch, 7. Mai 2014 10:23
    Dienstag, 6. Mai 2014 14:13
  • Synonyme werden hier erklärt: http://technet.microsoft.com/de-de/library/ms187552.aspx

    Und Prozeduren z.B. hier: http://technet.microsoft.com/de-de/library/ms345415.aspx

    Wenn das nicht ausreicht, würde ich ihn direkt auf eine Schulung in Sachen "SQL Server Entwicklung" ansprechen. Damit man einmal das lernt, von wem man noch nicht weiß, das man es nicht kennt und doch gut gebrauchen könnte :)


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    • Als Antwort markiert Robbo1984 Mittwoch, 7. Mai 2014 10:23
    Dienstag, 6. Mai 2014 14:19
  • Hi,
    Zunächst: Beherzige den Hinweis von Stefan. Das ist heavy was Du das fragst.

    Ich lese nichts über die Datenhaltung auf dem Tablet. Was läuft denn da? SQL Server Compact?
    Du möchtest doch deine Clients mittels einer Zentraldatenbank syncronisieren.
    Aus meiner Sicht, wäre es das Sync-Framework:
    http://msdn.microsoft.com/en-us/sync/bb821992
    oder
    http://msdn.microsoft.com/en-us/sync/bb821992

    Wenn Du die Option hast Windows-Azure zu nutzen: http://www.youtube.com/watch?v=5pqSvdS5NWA
    oder : http://clouduser.de/gastbeitraege/hintergrund-und-erste-schritte-mit-dem-sql-azure-sync-service-7370
    HTH

    Grüße Alexander

    • Als Antwort markiert Robbo1984 Mittwoch, 7. Mai 2014 10:23
    Dienstag, 6. Mai 2014 15:58

Alle Antworten

  • Hi,

    wenn Du SQL Server verwendest, solltest Du SqlConnection und nicht OleDbConnection einsetzen.

    Für die weiteren Fragen müsste man erst einmal wissen, was genau Du wie machen willst. Dauerhafte Synchronisation oder nur einmalig/unregelmäßig? In welchen Zeitabständen? Immer nur die eine Richtung oder soll der Abgleich beidseitig stattfinden? Sollen nur die Daten oder - falls geändert - auch die Struktur zusammengeführt werden? ...?

    Generell würde ich dir aber eher das RedGate SQL Comparison SDK ans Herz legen, wenn Du das über eine eigene Anwendung steuern willst. Das SDK bietet dir sämtliche Sachen, die Du hierfür benötigst und ist erprobt und zuverlässig. Es gibt viele Fallstricke (Trigger, Beziehungen, ...) die dir einen Strich durch die Rechnung machen können.

    http://www.red-gate.com/products/sql-development/sql-comparison-sdk/

    Falls Du das nur einmalig bzw. unregelmäßig machen willst und es nicht in einer eigenen Anwendung sein muss, schau dir mal RedGate SQL Data Compare an.

    http://www.red-gate.com/products/sql-development/sql-data-compare/

    ---

    Deine Fragestellung sagt ja schon, dass Du bei Null stehst und es daher schon an den Grundlagen scheitert. Daher denke ich, dass es derzeit nicht wirklich Sinn machen würde, sich an ein solches Projekt zu wagen. Dafür ist die Thematik doch zu komplex.

    Wenn Du es dennoch selbst machen willst, bitte die oben gestellen Fragen beantworten, dann schauen wir mal, was wir machen können.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 6. Mai 2014 11:29
    Moderator
  • Ich beschreibe mal den Fall. Ein Kunde wird demnächst mit Tablets ausgestattet. Diese sind allerdings nicht mit dem Netzwerk verbunden. Jedes der Tablets nimmt jeden Tag Daten auf. Am Ende eines jeden Tages sollen diese Daten in die Datenbank des Hauptservers über ein Netzkabel übertragen werden. Da  es 3 Tablets sind kann man nicht einfach nur rüber kopieren da es dann alles mit den laufenden Nummern nicht mehr passt.

    Mir fehlt nur wie ich das jetzt realisiere dass ich sage: Nehme daten A aus Datenbank Tablet und übertrage diese in die Tabelle der Datenbank Server. Die Abfrage  dass mir die richtigen laufenden Nummern dann angezeigt werden, die ist vorhanden...

    Dienstag, 6. Mai 2014 12:29
  • Ich hatte bisher nur eine Lösung wie ich 2 Datenbanken auf einem Server miteinander synchronisiert habe...

    Hier mal ein Ausschnitt:

     Private Sub SyncWunden()
    
            Dim cnnTablet As OleDbConnection
    
            Dim cmd As New OleDbCommand
    
            cnnTablet = Application.cnnTablet
    
            cmd.Connection = cnnTablet
    
            If cnnTablet.State = System.Data.ConnectionState.Open Then
    
    cmd.CommandText = SQL-Befehl

    Das war ja noch recht einfach, aber ich weiß gerade nicht wie ich das mit 2 connections realisiere. Wie muss ich vorgehen wenn ich dann 2 Connections erstellt habe?

    Dienstag, 6. Mai 2014 12:55
  • Hi,

    betrifft das nur einzelne Tabellen ohne Abhängigkeit untereinander? Oder auch Tabellen, die eine Hierarchie abbilden?

    Für den ersten Fall könnte man das noch relativ einfach lösen.

    Auf den Tablets kommt dann eine neue Spalte in die Tabellen, bspw. "IsNew Boolean NOT NULL, Default( 1 )". D.h. bei jedem neuen Datensatz wird das IsNew Flag auf True gesetzt.

    Für den Abgleich müsstest Du dann nur die Datensätze auslesen, die eben IsNew = 1 haben und dann auf den Server veröffentlichen.

    Um zweiten Fall wird es ungleich schwieriger, da Du für jeden einzelnen Datensatz die Reihenfolge der Anlage einhalten musst. Also zuerst den Hauptdatensatz einfügen, dann die vergebene ID ermitteln, diese dann auf dem Tablet im Unterdatensatz aktualisieren und dann den Unterdatensatz veröffentlichen.

    ---

    Wie genau Du veröffentlichen kannst, hängt davon ab, ob die Tablets über das Netzwerk direkt auf den SQL Server zugreifen können. Wenn Du bspw. einen Verbindungsserver vom lokalen SQL Server (Tablet) auf den Remote SQL Server (Server) erstellen kannst, wäre es recht einfach. In dem Fall musst Du die INSERT und ggfs. UPDATE Statements lediglich mit Angabe des Verbindungsservers erweitern. Du brauchst dann also in deiner Anwendung keine zwei Connections, sondern nur eine auf die lokale Datenbank. Den Rest macht das SQL Statement an sich über den Verbindungsserver.

    INSERT INTO [Verbindungsserver].[Datenbank].[dbo].Tabelle (
    Spalte1,
    Spalte2,
    Spalte3
    )
    SELECT Spalte1,
           Spalte2,
           Spalte3
    FROM   Tabelle WHERE IsNew = 1
    

    Das wäre ein Beispiel für den Fall, dass die Tabellen keine Beziehungen haben bzw. nicht keine Hierarchie benötigen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 6. Mai 2014 13:13
    Moderator
  • und mit der connection kann ich nicht arbeiten und irgendwie realisieren dass ich sage:

    Select * from TabelleA (von Connection1)

    Insert into TabelleA (von Connection2)

    Dienstag, 6. Mai 2014 13:26
  • Hi,

    doch, könntest Du schon. Aber nicht so, wie Du dir das vorstellst :)

    Letztendlich kannst Du natürlich die Daten aus Connection 1 bspw. in eine DataTable oder eine DataReader laden, diesen dann durchlaufen und für jede Zeile ein INSERT INTO Statement mit den entsprechenden Parametern erzeugen und das gegen Connection 2 absetzen.

    Also in etwa so:

    Dim SourceTable As DataTable
        <LadeDatenInSourceTable>
    
        For Each Row As DataRow in SourceTable.Rows
    
        Dim SqlStatement As String
            SqlStatement = "INSERT INTO Tabelle( Spalte1, Spalte2 ) VALUES( @Wert1, @Wert2 )"
    
        Dim SqlCommand As New SqlCommand( SqlStatement )
            SqlCommand.Parameters.AddWithValue( "@Wert1",    Row( "Spalte1" ) )
            SqlCommand.Parameters.AddWithValue( "@Wert2",    Row( "Spalte2" ) )
    
            SqlCommand.Connection = Connection2
            SqlCommand.ExecuteNonQuery()
    
        Next
    
    Das ist jetzt nur schnell dahingeschrieben und sicherlich optimierungswürdig :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Robbo1984 Mittwoch, 7. Mai 2014 10:23
    Dienstag, 6. Mai 2014 13:33
    Moderator
  • Gibt es einen Grund, warum nicht auch über Replikation nachgedacht wird?

    Ich kann zumindest Ausschlusskriterium entdecken. Insofern also das Anlegen neuer Spalten nicht das Problem ist... Prinzipiell gehört so eine Überlegung ja an den Anfang bei der Entwicklung einer Anwendung. Ich vermute also, da stehen wir.

    Das Arbeiten mit Verbindungsserverabfragen ist doch recht fehleranfällig.

    Prinzipiell würde ich also erstmal die zur Verfügung stehenden Technologien evaluieren, bevor man alles selbst entwickelt.

    Change Data Capture ist sicher auch eine Möglichkeit.

    just my 2 cents


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com



    Dienstag, 6. Mai 2014 13:46
  • Dies war meine vorherige Lösung ohne die 2 Connections....

    Welche Ihrer vorgeschlagenen Varianten würden sie anwenden bzw wie würden sie vorgehen?

    Dienstag, 6. Mai 2014 13:53
  • Hi,

    ich würde die Variante mit einem Verbindungsserver, wie auch in deinem Beispiel zu sehen, verwenden.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 6. Mai 2014 14:06
    Moderator
  • Egal für welche Variante sich hier entschieden wird, rate ich dringend, keinen (Verbindungs-)Servernamen im Anwendungscode zu hinterlegen.

    Mindestens mit Synonymen, besser mit einer gespeicherten Prozedur + Synonym arbeiten. Ansonsten sind graue Haare vorprogrammiert.


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    • Als Antwort markiert Robbo1984 Mittwoch, 7. Mai 2014 10:23
    Dienstag, 6. Mai 2014 14:13
  • Das sagte mir mein Vorgesetzter gerade auch. Aber wie hat das dann auszusehen?
    Dienstag, 6. Mai 2014 14:15
  • Synonyme werden hier erklärt: http://technet.microsoft.com/de-de/library/ms187552.aspx

    Und Prozeduren z.B. hier: http://technet.microsoft.com/de-de/library/ms345415.aspx

    Wenn das nicht ausreicht, würde ich ihn direkt auf eine Schulung in Sachen "SQL Server Entwicklung" ansprechen. Damit man einmal das lernt, von wem man noch nicht weiß, das man es nicht kennt und doch gut gebrauchen könnte :)


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    • Als Antwort markiert Robbo1984 Mittwoch, 7. Mai 2014 10:23
    Dienstag, 6. Mai 2014 14:19
  • Hi,
    Zunächst: Beherzige den Hinweis von Stefan. Das ist heavy was Du das fragst.

    Ich lese nichts über die Datenhaltung auf dem Tablet. Was läuft denn da? SQL Server Compact?
    Du möchtest doch deine Clients mittels einer Zentraldatenbank syncronisieren.
    Aus meiner Sicht, wäre es das Sync-Framework:
    http://msdn.microsoft.com/en-us/sync/bb821992
    oder
    http://msdn.microsoft.com/en-us/sync/bb821992

    Wenn Du die Option hast Windows-Azure zu nutzen: http://www.youtube.com/watch?v=5pqSvdS5NWA
    oder : http://clouduser.de/gastbeitraege/hintergrund-und-erste-schritte-mit-dem-sql-azure-sync-service-7370
    HTH

    Grüße Alexander

    • Als Antwort markiert Robbo1984 Mittwoch, 7. Mai 2014 10:23
    Dienstag, 6. Mai 2014 15:58