Konvertieren einer MySQL in eine MSSQL-Datenbank

Kürzlich stand ich vor dem Problem, dass ich die Daten aus einer MySQL-Datenbank in eine MS SQL Server 2005 Datenbank kopieren musste. Dafür stand mir lediglich die kostenlose SQL Server 2005 Express Edition zur Verfügung, die im Unterschied zu den Vollversionen keine Importfunktionen anbietet. Ich wollte ebenfalls kein Geld für eines der vielen ShareWare-Tools ausgeben, die eine bequeme Konvertierung von MySQL nach MSSQL versprechen. Also habe ich mir überlegt, dass es doch eine andere kostengünstigere Lösung geben muss. Und hier ist sie 🙂


Benötigt wird hierfür folgende Software, die es komplett umsonst im Internet zum Download gibt:

Nachdem alle Programme installiert sind, kann man auch schon anfangen, ein neues Windows-Projekt zu erstellen und alle benötigten Komponenten einzubinden (wichtig ist hier natürlich der Verweis auf die MySql.Data.dll). Die Vorgehensweise, die ich mir zuerst überlegt habe ist, jeweils eine Verbindung zur MySql-Datenbank und der zu füllenden MSSQL-Datenbank (deren Strukturen -sprich: Tabellen, Felder bzw. Datentypen – natürlich übereinstimmen müssen) herzustellen und zunächst ein DataSet mit den Daten aus der MySql-Datenbank zu befüllen. Anschließend wollte ich ein mit der MSSQL-Datenbank verbundenes DataSet mit der Methode merge mit den Daten aus dem ersten DataSet befüllen. Das hat auch soweit geklappt. Jedoch hat der nachfolgende Aufruf der Update()-Methode, der eine Synchronisation mit der Datenbank auslösen sollte, keine Veränderungen gezeigt: Die MSSQL-Datenbank blieb leer.

Der Grund hierfür ist, dass mit dem Mergen der Datenbanken der sog. rowstate der neuen Tabellenzeilen nicht als Änderungen bzw. hinzugefügte Zeilen erkannt werden und somit keine Übertragung beim Aufruf von Update() erfolgen. Doch hierfür gibt es Abhilfe: die AcceptChangesDuringFill-Eigenschaft eines DataSets kann vor dem Befüllen auf false gesetzt werden, so dass alle hinzugefügten Zeilen als neu hinzugefügt markiert sind, und bei einem Update auf einen anderen DataAdapter auch als diese erkannt werden. Somit wird nur ein DataSet benötigt und ein mergen überflüssig. Diese Technik kann übrigens auch für andere Datenbanksysteme, die sich mit .NET anzapfen lassen, genutzt werden. Der folgende Beispielcode bezieht sich allerdings auf das erwähnte Vorgehen für den Import von MySql-Daten in eine MS SQL Server Datenbank:

SqlConnection msConnection = new SqlConnection(connectionstring);
MySqlConnection myConnection = new MySqlConnection(connectionstring);
DataSet msDs = new DataSet();

msConnection.Open();
myConnection.Open();

SqlDataAdapter msDa = new SqlDataAdapter(sqlselect, msConnection);
MySqlDataAdapter myDa = new MySqlDataAdapter(sqlselect, myConnection);

SqlCommandBuilder c = new SqlCommandBuilder(msDa);
msDa.InsertCommand = c.GetInsertCommand();

myDa.AcceptChangesDuringFill = false;

myDa.Fill(msDs);
msDa.Update(msDs);
myConnection.Close();
msConnection.Close();

Einen Kommentar schreiben