Datenbank zur Laufzeit wechseln

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ctm5000.

    Datenbank zur Laufzeit wechseln

    Hallo,
    es gibt ein Problem wo mir zum lösen ein kleiner Denkanstoss fehlt.
    Ich habe eine Software die bis jetzt mit SQLCE problelos arbeitet. Nun wollte ich das Programm so erweitern, das ich auswählen kann ob ich SQLCE oder Mysql/MariaDB (damit es netzwerkfähig wird) nutzen kann.
    Ich kann problemlos auf beide DB's zugreifen. Ich deklariere meine Variablen folgendermaßen für den DB-Zugriff:

    Quellcode

    1. Dim dbfile As String
    2. Dim sAppPath As String
    3. Dim reader As SqlServerCe.SqlCeDataReader
    4. sAppPath = IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly.Location)
    5. If Not sAppPath.EndsWith("\") Then sAppPath = sAppPath & "\"
    6. dbfile = sAppPath & "db.sdf"
    7. Dim con As New System.Data.SqlServerCe.SqlCeConnection
    8. Dim cmd As New SqlCeCommand
    9. Dim gesp as integer=0
    10. 'etwas auslesen...
    11. Try
    12. con = New SqlCeConnection("Data Source=" & dbfile & " ; Database Password='123'")
    13. cmd.CommandText = "select anzahl from einstellungen"
    14. con.Open()
    15. cmd = New SqlCeCommand(cmd.CommandText, con)
    16. reader = cmd.ExecuteReader()
    17. Do While reader.Read()
    18. If Not IsDBNull(reader("anzahl")) Then
    19. gesp = CInt(reader("anzahl"))
    20. End If
    21. Loop
    22. reader.Close()
    23. con.Close()
    24. Catch ex As Exception
    25. con.close()
    26. MsgBox(ex.Message)
    27. End Try
    28. 'fertig

    So klappts mit sqlce ohne Probleme.

    Jetzt muss ich vorher abfragen ob MySQl oder SQLCE.
    Was bei der Deklaration nicht funktioniert ist:

    Quellcode

    1. if datenbank="ce" then
    2. Dim con As New System.Data.SqlServerCe.SqlCeConnection
    3. Dim cmd As New SqlCeCommand
    4. Dim reader As SqlServerCe.SqlCeDataReader
    5. else
    6. Dim con As New MySql.Data.MySqlClient.MySqlConnection
    7. Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
    8. Dim reader As MySql.Data.MySqlClient.MySqlDataReader
    9. end if

    Ist ja auch logisch.

    Was aber auch nicht geht ist die Variable(n) "con" als public zu deklarieren und dann später als MySql.Data.MySqlClient.MySqlConnection oder System.Data.SqlServerCe.SqlCeConnection zuzuweisen.

    Mir geht es darum, wie ich am einfachsten meinen Code umstellen kann, um entweder den mysqlserver oder sqlce anzusprechen.Dabei möchte ich gerne meine bisherige Struktur erhalten und eigentlich am liebsten nur die Variablen ändern(da sie ja überall so drinnstehen). Irgendwie steh ich grad aufm Schlauch.
    alle Connections von alle DBProvider erben von der Klasse DBConnection.
    Guck dir die Geschichte im ObjectBrowser an.
    Du kannst also jede Connection in eine Variable dieses allgemeineren Typs tun, und im Weiteren damit programmieren.

    Wenn du deine Architektur so aufbaust, dass dieses an zentraler Stelle geschieht, dann kannst du die DB wechseln, ohne dass deine Anwendung es "merkt".

    Dieses OOP-Feature mit der allgemeiner gefassten Basisklasse nennt man "Polymorphie", und das Konzept, den DataAccess-Layer der Anwendung unterm Hintern auszuwechseln ist eine Anwendung des sog. "Strategy-Pattern".

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Vielen Dank. Das hat geholfen. Diesen Denkanstoss hab ich gebraucht. :thumbsup:

    Ich hab mal kurz getestet mit:

    Quellcode

    1. ​ Dim con As System.Data.Common.DbConnection

    und dann später zugewiesen mit:

    Quellcode

    1. ​ con = New System.Data.SqlServerCe.SqlCeConnection("Data Source=" & dbfile & " ; Database Password='123")


    .. klappt wunderbar. Jetzt kann ich mir nochmal Gedanken machen wie ich das am einfachsten umsetze.