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
Hallo Below,
für deinen Webshop gibt es 2 Möglichkeiten :
Du nutzt eine Sync-Funktion der Datenbank. Könnte bei 2 verschiedenen Datenbanken schwierig werden.
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
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
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...)
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.
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
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.
- 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