och tänkte att den där borde man ju kunna använda som en grund
men jag vill ju inte behöva modifiera den om jag byter DB utan då vill jag bara behöva ändra i nästa steg
Så jag
slängde ihop en/Ett
IDataHandler
DataHandler
DataHandlerSQLServer
DataHandlerMySQL
Namespace Data
Public Interface IDataHandler : Inherits System.IDisposable
Property CommandText() As String
ReadOnly Property Command() As System.Data.IDbCommand
Sub AddParameter(ByVal Name As String, ByVal Type As System.Data.DbType, ByVal value As Object)
Function ExecuteReader() As System.Data.IDataReader
Function ExecuteNonQuery() As Integer
Function ExecuteScalar() As Object
End Interface
Public Enum DbEngine
SQLServer
MySQL
End Enum
Public Class Datahandler : Implements IDataHandler
Private DBHandler As IDataHandler
Public Sub New(ByVal DBType As DbEngine)
Try
Select Case DBType
Case DbEngine.SQLServer
DBHandler = New datahandlerMSSQL()
Case DbEngine.MySQL
DBHandler = New dataHandlerMySql
End Select
Catch
Throw New Exception("OUPS")
End Try
End Sub
Public Sub AddParameter(ByVal Name As String, ByVal Type As System.Data.DbType, ByVal value As Object) Implements IDataHandler.AddParameter
DBHandler.AddParameter(Name, Type, value)
End Sub
...... osv
Private disposedValue As Boolean = False ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
DBHandler.Dispose()
' TODO: free other state (managed objects).
End If
End If
Me.disposedValue = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
End Class
Public Class datahandlerMSSQL : Implements IDataHandler
Private _command As System.Data.SqlClient.SqlCommand
Private _Connection As System.Data.SqlClient.SqlConnection
Public Sub New()
_Connection = New System.Data.SqlClient.SqlConnection
_Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings(0).ConnectionString
_Connection.Open()
_command = _Connection.CreateCommand
End Sub
'Und So Veiter
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
_Connection.Close()
_command.Dispose()
_Connection.Dispose()
End If
End If
Me.disposedValue = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
End Class
End Namespace
(Självklart ligger det uppdelat på flera filer)
Används sedan
Using DbHandler As New RHDF.Data.Datahandler(RHDF.Data.DbEngine.SQLServer)
End Using
Du kan ta bort din "DbEngine" och istället skicka in en instans av dina Engines till din DataHandler konstruktor.. Switch gör bara koden svårare att underhålla.. tex om du ska lägga till en ny DBEngine så måste du uppdatera din Switch och din enum. Bättre att göra följande:
Using DbHandler As New RHDF.Data.Datahandler(new DatahandlerMSSQL())
Du kan sedan använda dig av Factory pattern och Dependency Injection för att skapa och trycka in din DataHandler till DataHandler klassen.
En annan sak.. det finns redan en provider lösning i ADO.Net 2.0, ta en titt på det, kan kanske vara intresant: