webForumDet fria alternativet

Dataklass, har jag tänkt rätt

.NET

4 svar · 568 visningar · startad av rhdf

Medlem sedan okt. 2007446 inlägg
Frågan#1

jag satte mig för "skoj" skull och byggde ett litet klassbibliotek för att sköta de vanliga databas "ärendena" Connect,command osv
jag hittade för ett tag sedan denna:
http://crs.rappendal.se/post/2008/07/Dataklass-for-SQL-Server.aspx

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

Förbättringar?
är det helt åt helvete kodat?

Tips på snygg felhantering osv mottages

Medlem sedan okt. 200850 inlägg
#2

Har lite comment:

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:

http://www.c-sharpcorner.com/UploadFile/mosessaur/abstractfactoryadonet202152006053643AM/abstractfactoryadonet2.aspx?ArticleID=4468e7cc-57c1-4738-8e83-a8db48fd1d9f

Medlem sedan okt. 2007446 inlägg
#3

Det där verkar värt att kolla på

Medlem sedan okt. 200850 inlägg
#4

Sedan skulle du nog lätt kunna modifiera PAG's Data Access Application Block som följer med i Ent Lib..

Medlem sedan okt. 2007446 inlägg
#5

Ja det skulle man ju kunna göra MED ;)
jisses nu blev det mycket igen, jag ville ju bara ha en enkelt återanvändbar dataklass ;)

265 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)