Hallo,
ich versuche mich gerade an einer Lösung um schnell und einfach Abfragen in MySQL und MSSQL zu realisieren. Früher hatte ich immer eine Art globale Variable in der steht, ob es MySQL oder MSSQL ist, entsprechend habe ich dann immer eine neue Instanz der jeweiligen Klasse erstellt. Dafür musste ich aber ständig if-Abfragen einbauen und das kann keine Lösung sein, vor allem nicht bei einem größeren Projekt was ich derzeit anstrebe. Daher habe ich mal mit meinem (noch geringen Wissen) mit OOP an die Sache heran gewagt.
Gegeben ist folgendes:
Eine Form, auf der die verschiedenen Einstellen getätigt werden (Server, Nutzername, Passwort, etc...). Das soll alles mittels DataBinding geschehen. Diese Einstellungen werden am Ende serialisiert und sind somit jederzeit aufrufbar. Ich habe mir jetzt folgende Klassen erstellt:
SqlVerbindung.vb (Basisklasse):
Spoiler anzeigen
MySqlVerbindung.vb:
Spoiler anzeigen
MsSqlVerbindung.vb:
Spoiler anzeigen
SqlFactory.vb:
Ich habe also in meiner Form eine BindingSource (DataSource = SqlVerbindung) und binde die Eigenschaften an meine Eingabemaske.
Möchte ich jetzt eine Abfrage ausführen, so muss ich erst die DataSource in SqlVerbindung casten, dann nach der Art schauen und mir mittels der SqlFactory die entsprechende Klasse geben lassen. Dann habe ich die Einstellungen aber nicht mehr und müsste diese neu setzen. Ebenso, wenn ich die Einstellungen später lade um erneut eine Abfrage auszuführen, wie gehe ich da vor? Deserialisiere ich zur Klasse SqlVerbindung, schaue nach Art und gebe mir erneut mittels SqlFactory die korrekte Klasse wieder (ohne Einstellungen)? Das kann irgendwie nicht richtig sein. Ich renne wahrscheinlich gerade vom hundertsten ins tausendste ins millionste
Wie gehe ich das also am besten an?
Über jede Antwort bin ich dankbar!
*Topic verschoben*
ich versuche mich gerade an einer Lösung um schnell und einfach Abfragen in MySQL und MSSQL zu realisieren. Früher hatte ich immer eine Art globale Variable in der steht, ob es MySQL oder MSSQL ist, entsprechend habe ich dann immer eine neue Instanz der jeweiligen Klasse erstellt. Dafür musste ich aber ständig if-Abfragen einbauen und das kann keine Lösung sein, vor allem nicht bei einem größeren Projekt was ich derzeit anstrebe. Daher habe ich mal mit meinem (noch geringen Wissen) mit OOP an die Sache heran gewagt.
Gegeben ist folgendes:
Eine Form, auf der die verschiedenen Einstellen getätigt werden (Server, Nutzername, Passwort, etc...). Das soll alles mittels DataBinding geschehen. Diese Einstellungen werden am Ende serialisiert und sind somit jederzeit aufrufbar. Ich habe mir jetzt folgende Klassen erstellt:
SqlVerbindung.vb (Basisklasse):
VB.NET-Quellcode
- Imports System.Data.Common
- <Serializable>
- Public MustInherit Class SqlVerbindung
- Enum SqlDataType
- VarChar
- Text
- Int
- End Enum
- Protected AbfragenMY As New Dictionary(Of String, String) From
- {
- {"Datenbanken", "SHOW DATABASES"}
- }
- Protected AbfragenMS As New Dictionary(Of String, String) From
- {
- {"Datenbanken", "SELECT name FROM master.dbo.sysdatabases"}
- }
- Private _Server As String
- Public Property Server As String
- Get
- Return _Server
- End Get
- Set(value As String)
- _Server = value
- End Set
- End Property
- Private _Benutzer As String
- Public Property Benutzer As String
- Get
- Return _Benutzer
- End Get
- Set(value As String)
- _Benutzer = value
- End Set
- End Property
- Private _Passwort As String
- Public Property Passwort As String
- Get
- Return _Passwort
- End Get
- Set(value As String)
- _Passwort = value
- End Set
- End Property
- Private _Datenbank As String
- Public Property Datenbank As String
- Get
- Return _Datenbank
- End Get
- Set(value As String)
- _Datenbank = value
- End Set
- End Property
- Private _Art As String
- Public Property Art As String
- Get
- Return _Art
- End Get
- Set(value As String)
- _Art = value
- End Set
- End Property
- Private _Port As UShort = 3306
- Public Property Port As UShort
- Get
- Return _Port
- End Get
- Set(value As UShort)
- _Port = value
- End Set
- End Property
- Private _IntegratedSecurity As Boolean
- Public Property IntegratedSecurity As Boolean
- Get
- Return _IntegratedSecurity
- End Get
- Set(value As Boolean)
- _IntegratedSecurity = value
- End Set
- End Property
- Protected MustOverride Function BekommeVerbindung() As DbConnection
- Protected MustOverride Function SqlSelect(ByVal Name As String, Optional ByVal Parameter As DbParameter() = Nothing) As DataTable
- Protected MustOverride Function ErstelleParameter(ByVal Name As String, ByVal Value As Object, ByVal Typ As SqlDataType) As DbParameter
- Protected MustOverride Sub SqlUpdate()
- End Class
MySqlVerbindung.vb:
VB.NET-Quellcode
- Imports System.Data.Common
- Imports Devart.Data.MySql
- <Serializable>
- Public Class MySqlVerbindung
- Inherits SqlVerbindung
- Protected Overrides Sub SqlUpdate()
- Throw New NotImplementedException()
- End Sub
- Protected Overrides Function SqlSelect(Name As String, Optional Parameter() As DbParameter = Nothing) As DataTable
- Using con = BekommeVerbindung()
- Using cmd As New MySqlCommand(AbfragenMY(Name), con)
- If Parameter IsNot Nothing Then
- cmd.Parameters.AddRange(Parameter)
- End If
- Using ada As New MySqlDataAdapter(cmd)
- Using dt As New DataTable
- ada.Fill(dt)
- Return dt
- End Using
- End Using
- End Using
- End Using
- End Function
- Protected Overrides Function ErstelleParameter(Name As String, Value As Object, Typ As SqlDataType) As DbParameter
- Dim parameter As New MySqlParameter()
- With parameter
- .ParameterName = Name
- .Value = Value
- Select Case Typ
- Case SqlDataType.Int
- .MySqlType = MySqlType.Int
- Case SqlDataType.Text
- .MySqlType = MySqlType.Text
- Case SqlDataType.VarChar
- .MySqlType = MySqlType.VarChar
- End Select
- End With
- Return parameter
- End Function
- Protected Overrides Function BekommeVerbindung() As DbConnection
- Return New MySqlConnection() With {
- .Host = Me.Server,
- .UserId = Me.Benutzer,
- .Password = Me.Passwort,
- .Database = Me.Datenbank,
- .Port = Me.Port,
- .Charset = "UTF8"}
- End Function
- End Class
MsSqlVerbindung.vb:
VB.NET-Quellcode
- Imports System.Data.Common
- Imports System.Data.SqlClient
- <Serializable>
- Public Class MsSqlVerbindung
- Inherits SqlVerbindung
- Protected Overrides Sub SqlUpdate()
- Throw New NotImplementedException()
- End Sub
- Protected Overrides Function SqlSelect(Name As String, Optional Parameter() As DbParameter = Nothing) As DataTable
- Using con = BekommeVerbindung()
- Using cmd As New SqlCommand(AbfragenMS(Name), con)
- If Parameter IsNot Nothing Then
- cmd.Parameters.AddRange(Parameter)
- End If
- Using ada As New SqlDataAdapter(cmd)
- Using dt As New DataTable
- ada.Fill(dt)
- Return dt
- End Using
- End Using
- End Using
- End Using
- End Function
- Protected Overrides Function ErstelleParameter(Name As String, Value As Object, Typ As SqlDataType) As DbParameter
- Dim parameter As New SqlParameter
- With parameter
- .ParameterName = Name
- .Value = Value
- Select Case Typ
- Case SqlDataType.Int
- .SqlDbType = SqlDbType.Int
- Case SqlDataType.Text
- .SqlDbType = SqlDbType.Text
- Case SqlDataType.VarChar
- .SqlDbType = SqlDbType.VarChar
- End Select
- End With
- Return parameter
- End Function
- Protected Overrides Function BekommeVerbindung() As DbConnection
- Dim con As New SqlConnection
- If Me.IntegratedSecurity = True Then
- con.ConnectionString = New SqlConnectionStringBuilder With {
- .DataSource = Me.Server,
- .IntegratedSecurity = True,
- .InitialCatalog = Me.Datenbank}.ConnectionString
- Else
- con.ConnectionString = New SqlConnectionStringBuilder With {
- .DataSource = Me.Server,
- .UserID = Me.Benutzer,
- .Password = Me.Passwort,
- .InitialCatalog = Me.Datenbank}.ConnectionString
- End If
- Return con
- End Function
- End Class
SqlFactory.vb:
Ich habe also in meiner Form eine BindingSource (DataSource = SqlVerbindung) und binde die Eigenschaften an meine Eingabemaske.
Möchte ich jetzt eine Abfrage ausführen, so muss ich erst die DataSource in SqlVerbindung casten, dann nach der Art schauen und mir mittels der SqlFactory die entsprechende Klasse geben lassen. Dann habe ich die Einstellungen aber nicht mehr und müsste diese neu setzen. Ebenso, wenn ich die Einstellungen später lade um erneut eine Abfrage auszuführen, wie gehe ich da vor? Deserialisiere ich zur Klasse SqlVerbindung, schaue nach Art und gebe mir erneut mittels SqlFactory die korrekte Klasse wieder (ohne Einstellungen)? Das kann irgendwie nicht richtig sein. Ich renne wahrscheinlich gerade vom hundertsten ins tausendste ins millionste
Wie gehe ich das also am besten an?
Über jede Antwort bin ich dankbar!
*Topic verschoben*
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()