Laden...

Datenbanken synchronisieren

Erstellt von below vor 15 Jahren Letzter Beitrag vor 15 Jahren 6.581 Views
B
below Themenstarter:in
114 Beiträge seit 2007
vor 15 Jahren
Datenbanken synchronisieren

verwendetes Datenbanksystem: MSSQL & MySql

Hallo,

nach langer C# Abstinenz habe ich wieder ein Projekt vor mir liegen. Ich muss einen Webshop und eine Homepage mit Artikeldaten aus einer Microsoft Dynamics Datenbank (MSSQL) versorgen.

Da von aussen nicht auf die interne Datenbank zugegriffen werden soll, möchte ich zunächst die notwendigen Tabellen (ca. 10) aus der Dynamics Datenbank mit einer MySql Datenbank auf dem Webserver synchronisieren.

Mit Datenbanken in Verbindung mit C# habe ich noch nie gearbeitet und wollte mich vorab einfach mal erkundigen, was Ihr für eine Vorgehensweise vorschlagen würdet.

Gibt es bestimmte Objekte, Codesammlungen etc die für eine solche Synchronisierung eingesetzt werden können/sollten?

VG below

3.825 Beiträge seit 2006
vor 15 Jahren

Hallo Below,

für deinen Webshop gibt es 2 Möglichkeiten :

  1. Du nutzt eine Sync-Funktion der Datenbank. Könnte bei 2 verschiedenen Datenbanken schwierig werden.

  2. Du schreibst ein Programm dass sich alle neuen und geänderten Daten holt und in den Webshop schreibt. Dazu musst Du feststellen können welche Daten geändert wurden.

Datenbankzugriff (gestern um das Kapitel MYSQL erweitert) :

http://www.seven-c.de/files/DatenbankenHowto.htm

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

B
below Themenstarter:in
114 Beiträge seit 2007
vor 15 Jahren

Vielen Dank. Super Seite - werd ich mir jetzt erstmal durchlesen

K
30 Beiträge seit 2008
vor 15 Jahren

http://msdn.microsoft.com/de-de/library/bb902818.aspx

vlt. kann dir das behilflich sein...

B
below Themenstarter:in
114 Beiträge seit 2007
vor 15 Jahren

Ich muss das Ganze nochmal nach oben bringen.

Die genannten Links, vor allem die Seite von BerndFfm haben mir schon mal sehr weitergeholfen.

Die Verbindung zu beiden Datenbanken und auch das Auslesen der jeweiligen Daten funktioniert wunderbar.

Auch das Auslesen der MySql Datanbank, das Ändern von Beispieldaten und das zurückschreiben per Adapter.Update klappt.

Nun aber zu meinem Problem:

Was ist die beste möglichkeit, die Daten der MSSQL Tabelle nun in die MySql Tabelle zu transferieren?

Mein bisheriger Stand:


conn = new MySqlConnection(connString);
conn2 = new SqlConnection(connString2);
            
cmd = new MySqlCommand("SELECT * FROM `TabelleMySql`", conn);
cmd2 = new SqlCommand("SELECT Feld1, Feld2, Feld3, Feld4 FROM TabelleMSSQL";", conn2);
            
adapter = new MySqlDataAdapter(cmd);
adapter2 = new SqlDataAdapter(cmd2);

MySqlCommandBuilder myCmdB = new MySqlCommandBuilder(adapter);
SqlCommandBuilder myCmdB2 = new SqlCommandBuilder(adapter2);

In einem Try-Block führe ich dann folgendes aus:


conn.Open();
conn2.Open();

countWeb = adapter.Fill(myDataset, "WebShop_Item");
countLocal = adapter2.Fill(myDataset, "WebShop_Item2");

Somit habe ich beide Tabellen im Dataset. Durchlaufe ich die Spalten der beiden Tabellen und lasse mir den DataType ausgeben, scheinen beide Tabellen auch gleich zu sein. Das einzige Problem, dass ich momentan sehe ist, dass in der MSSQL Tabelle ein Feld vom Typ decimal enthalten ist. Die MySql Tabelle hat dieses Feld zwar auch, nur den Typ unterscheidet sich ja je nach Datenbanksystem. Kann es dort zu Schwierigkeiten kommen?

Ich möchte jetzt den Inhalt von Tabelle WebShop_Item mit den Daten der Tabelle WebShop_Item2 aktualisieren um diese dann anschließend per Update hochzuladen.

Kann mir da jemand einen guten Tipp geben?

VG below

R
119 Beiträge seit 2008
vor 15 Jahren

also ich portiere gerade eine PHP/MySQL project auf MSSQL und ASP.NET

stand also vor dem gleichen Problem wie du und kann dir sagen, du wirst noch viel spaß haben

jeh nach verwendeten Datentypen kannst du umconvertieren (zb UInt und Int usw)

ich hab das bei mir so gelöst, dass es eine Klasse gibt die, das dataset enthält.

einer CopyKlasse werden Ziel und Quelle übergeben + einem Converter

dieser convertiert auf row-granularität. so kannst du dann ohne probleme mappen (auch wenn sich zb die spaltennahmen ändern...)

X
1.177 Beiträge seit 2006
vor 15 Jahren

Huhu,

naja, ich arbeite zwar nie mit DataSets, aber es gibt da die DataSet.Merg() Methode, die genau das machen sollte was du willst.

Vorgehen wäre:
2 Datasets befüllen (nicht nur eines)
Dataset.Merge(Dataset) aufrufen
das Dataset von MySQL wieder speichern.

Wie der Merge mit gelöschten Daten umgeht kann ich nicht sagen. Alternativ die beiden Datasets durchlaufen und per Hand vergleichen.

🙂

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

3.825 Beiträge seit 2006
vor 15 Jahren

Hallo Below,

ich mache das so dass ich alle Reihen und Spalten durchgehe und ggf. den Datentyp konvertiere.

Bei verschiedenen Datenbanken sind die Datentypen oft unterschiedlich, z.B. nimmt man bei MS SQL bool und bei MySQL TinyInt.


foreach (DataColumn col in ds.Tables[tab].Columns)
	for (DataColumn col2 in ds2.Tables[tab2].Columns)
		if (col.ColumnName == col2.ColumnName)
		{
                    if (col.DataType == typeof(bool)) ds2.Tables[tab].Rows[i][col.ColumnName] = Convert.ToInt32(ds.Tables[tab].Rows[i][col.ColumnName]);
                    else ...
		}

Das ist nur ein Vorschlag, ungeprüft.

Bei Datumsfeldern kann das Format auch unterschiedlich sein :

logouttime = (DateTime)(MySqlDateTime)ds...

Xynratron: Wenn in beiden Datenbanken die Datentypen und die Reihenfolge der Felder unterschiedlich sind weiss ich nicht ob das Laden ins Dataset und Speichern des Dataset in die andere Datenbank so funktioniert. Müsste man einfach mal probieren.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

X
1.177 Beiträge seit 2006
vor 15 Jahren

Xynratron: Wenn in beiden Datenbanken die Datentypen und die Reihenfolge der Felder unterschiedlich sind weiss ich nicht ob das Laden ins Dataset und Speichern des Dataset in die andere Datenbank so funktioniert. Müsste man einfach mal probieren.

jo, wobei ich aber eigentlich glaube, dass es bei "geringen" Unterschieden schon nicht mehr geht. Auch ein löschen kann ich mir nicht vorstellen, ausser es gibt eine Option "lösche in DS2 wenn in DS1 nicht mehr vorhanden".

🙂

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

2.891 Beiträge seit 2004
vor 15 Jahren
  1. Du nutzt eine Sync-Funktion der Datenbank. Könnte bei 2 verschiedenen Datenbanken schwierig werden.

Es gibt doch auch das Microsoft Sync Framework. Habe ich zwar (noch) nicht benutzt, aber z.B. der Name "Sync Services for ADO.NET 2.0" würde für mich drauf schließen lassen, dass sich damit alle Datenbanken mit einem ADO.NET-Provider synchronisieren lassen - also sicher auch MySQL mit MSSQL (MSSQL-Compact mit einem MSSQL-Express kann ich sagen, dass es sicher geht. Edit: Link).

Gruß
dN!3L