Mehrere Datenbanken unterstützen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Mehrere Datenbanken unterstützen

    Hallo,


    Ich fange bald mit einem neuen Projekt an, welche auf eine Datenbank zugreifen soll.
    Dabei soll der User allerdings die Möglichkeit haben, zwischen verschiedenen Datenbanken wie SQL, SQLite, Acces, MySQL,... zu wählen.
    Doch wie stell ich das am besten an?

    Die Datenbankverbindung ist ja je nach Typ anders und auch die Abfragen sind je nach Typ anders.
    Theoretisch kann ich ja bei jeder Funktion, welche auf die DB zugreift, zuerst prüfen, welcher DB-Typ verwendet wird und danach das SQL-Skript entsprechend anpassen.
    Aber es gibt wahrscheinlich sauberere Lösungen?!


    Gruss
    Sandiro
    Möchte man die Anwendung portabel haben, kann man eine Access-Datenbank verwenden. Bei vielen Benutzern eignet sich ein SQL-Server, oder wenn man die Daten von mehreren Computern braucht kann man auch eine MySQL-Datenbank verwenden. Wer keinen SQL-Server (Express) installiert hat und keine MySQL-Datenbank zur Verfügung hat, verwendet einfach die Access-Datenbank.
    Was ist der Nachteil, wenn der Benutzer die Wahl hat?

    Gruss
    Sandiro
    Ganz simple Sache...

    Mach dir nen Array für Recordsets, Connectionstrings usw. und setz am Anfang einmal einen Integerwert, der Festlegt welche Datenbank du benutzen willst...

    Also alle Arraypositionen (0) ob nur RS(0) oder Con(0) sind dann zB. für MDB und alle (1) sind für SQL Server... usw.

    Hab ich auch so gelöst... Ohne Verbindung zum Server greift mein Tool auf ne MDB zu und sonst aufn SQL Server...

    Musst halt nur jede popelige Abfrage die sich unterscheidet doppelt schreiben.
    Wobei bei MDB und SQL Server zB. ist eigentlich das Meiste identisch... Da brauchst eigentlich nur nen anderen Connectionstring...

    Hempelchen schrieb:

    Also alle Arraypositionen (0) ob nur RS(0) oder Con(0) sind dann zB. für MDB und alle (1) sind für SQL Server... usw.

    Kotz ...

    Was man braucht ist ein sogenannter Abstraction Layer.
    Entweder verwendet man die Enterprise Library von MS (da ist der DB Abstraction Layer nämlich drin), oder man schreibt sich selbst was. Ob OleDBConnection, OleDBReader etc alle erben jeweils von generischen Klassen: DBConnection, DBReader usw
    Also braucht man nur eine Wrapper-Klasse, die zb OleDBConnection als DBConnection liefert, wenn man JetOLE verwendet oder eine SQLConnection als DBConnection wenn man einen SQL-Server verwendet. Analog für SQLite, MySQL usw.
    Sind nur ein paar Zeilen, ABER
    Aufpassen muss man bei Paramtern in DBCommand, da nicht jede DB named parameters unterstützt bzw sie unterschiedlich geschrieben werden. Also muss man das entweder weglassen, oder einen "Übersetzer" einbauen - zweiteres ist zu bevorzugen und auch nicht viel extra Arbeit. Natürlich muss man auch noch bei der Syntax aufpassen und sollte vermutlich allzu komplexe SQL Befehle lieber in kleinere zerlegen. Ggf halt immer auf den kleinsten gemeinsamen Nenner achten.

    Grundsätzlich dürfte das auch mit dem Entity-Framework gehen, aber das funzt vermutlich nur mit MS Datenbanken zuverlässig.

    Enterprise Lib:
    msdn.microsoft.com/en-us/library/ff648951.aspx
    DBLayer: msdn.microsoft.com/en-us/library/ff664408(v=PandP.50).aspx