Alessandro Badalin


Il blog di Alessandro Badalin
Blogs Amici
Archivio Posts
Anno 2008

Anno 2007

GESTIONE ACCESSI AL DATABASE SEMPLIFICATA

GESTIONE ACCESSI AL DATABASE SEMPLIFICATA (ADO.NET)

Quando si crea un’applicazione che interagisce con un Database, inevitabilmente si incappa nella necessità di  inserire codice ripetitivo con il rischio di rendere il codice meno pulito e chiaro.

A tale scopo ho sviluppato una classe (ancora in versione Beta Test) che sto da tempo utilizzando e che si sta rivelando particolarmente utile per queste sue potenzialità:

-          Crea automaticamente la stringa di connessione al Database (Sql/OLEDB) consentendo comunque di crearne una personalizzata;

-          Rende molto più semplice ed elegante il codice delegando gran parte delle routine di gestione del Database alla classe;

-          Consente di creare in modo semplificato DataSet/DataTable con grande semplicità;

-          Consente la gestione del Database sia in modalità Connessa che Disconnessa;

Di seguito riepilogo proprietà e metodi della classe che ho denominato GestDbase (Namespace Database).

Proprietà

Valore

Descrizione

DatabaseName

String

Indica il nome del Database a cui collegarsi

ServerName

String

Indica il nome del Server a cui collegarsi (Solo per connessione a SQL Server)

Position

Enum (LocalAttach;Server)

Indica se il database locale o su Server (necessario per la creazione automatica della stringa di connessione)

 

Metodo

Sintassi

Descrizione

OpenDbase

Istanza.OpenDbase()

Apre la connessione con il Database

(Restituisce True se la connessione è stabilita e False in caso contrario)

CloseDbase

Istanza.CloseDbase()

Chiude la connessione con il Database

LeggiDati

(SqlServer)

Istanza.LeggiDati(ByVal SqlCmd As SqlCommand)

Crea un DataReader in base al parametro SqlCommand passato. Si potrà far riferimento al DataReader creato in questo modo Istanza.MySqlReader.

Restituisce True se la creazione è andata a buon fine, diversamente restituisce False

LeggiDati (OLEDB)

Istanza.LeggiDati(ByVal OLECmd As OLEDbCommand)

Crea un Datareader in base al parametro OLEDbCommand passato. Si potrà far riferimento al DataReader creato in questo modo Istanza.MyOLEReader

Restituisce True se la creazione è andata a buon fine, diversamente restituisce False

SalvaDati

(Sql Server)

Istanza.SalvaDati(ByVal SqlCmd As SqlCommand)

Esegue la query di comando passata come parametro.

Restituisce il numero di record interessati .

SalvaDati (OLEDB)

Istanza.SalvaDati(ByVal OLECmd As OLEDbCommand)

Esegue la query di comando passata come parametro.

Restituisce il numero di record interessati .


 

CreaDataTable

(Sql Server)

Istanza.CreaDataTable(ByVal SqlDA As SqlDataAdapter, ByVal SqlCmd As SqlCommand, ByVal TableName As String, ByVal Mode As DTMode)

Genera un DataSet/Datatable in base ai parametri passati.

Restituisce True se il DataTable viene generato con successo.

Si potrà far riferimento al DataSet creato in questo modo Istanza.DS

CreaDataTable

(OLEDB)

Istanza.CreaDataTable(ByVal SqlDA As SqlDataAdapter, ByVal OLECmd As OLECommand, ByVal TableName As String, ByVal Mode As DTMode)

Genera un DataSet/Datatable in base ai parametri passati.

Restituisce True se il DataTable viene generato con successo.

Si potrà far riferimento al DataSet creato in questo modo Istanza.DS

SalvaDataTable (Sql Server)

SalvaDataTable(ByVal SqlDA As SqlDataAdapter, ByVal TableName As String)

Salva il DataSet/DataTable.

Restituisce True se il DataTable è stato salvato con successo.

SalvaDataTable (OLEDB)

SalvaDataTable(ByVal OLEDA As OLEDBDataAdapter, ByVal TableName As String)

Salva il DataSet/DataTable.

Restituisce True se il DataTable è stato salvato con successo.

 

Un semplice esempio di come utilizzare la classe (Sql)

Creiamo una nuova Form e aggiungiamo un controllo DataGridView e aggiungiamo il riferimento alla libreria di classe GestDbase alla soluzione.

Imports Database  ‘ Namespace Database da cui deriva la classe GestDbase

Imports System

Imports System.Data.SqlClient

 

Public Class Form1

 

    ‘ Genera un istanza della nostra classe specificanto il tipo di database

 

    Dim DbDbase As New Database.GestDbase(GestDbase.DbType.SQL)

 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As   System.EventArgs) Handles MyBase.Load

 

        ‘ Inizializza le proprietà indicando il nome del database, il nome del

        ‘ Server e la posizione del database (nel nostro caso supponiamo si

        ‘ trovi su un server

 

        DbDbase.DatabaseName = "MIODBASE"

        DbDbase.ServerName = ".\SQLEXPRESS"

        DbDbase.Position = GestDbase.DbPosition.Server

 

        ‘ Crea un oggetto SqlCommand da passare al nostro oggetto per la

        ‘ creazione del DataSet

 

        Dim SqlCmd As New SqlCommand

        SqlCmd.CommandText = "SELECT * FROM MiaTabella"

 

        Dim DaTest As New SqlDataAdapter

 

        ‘ Apre la connessione al database e genera il DataTable automaticamente,

        ‘ poi chiudo la connessione

 

        DbDbase.OpenDbase()

        DbDbase.CreaDataTable(DaTest, SqlCmd, "MiaTabella", GestDbase.DTMode.Fill)

        DbDbase.CloseDbase()

 

        ‘ Effettua il binding del DataTable con il DataGridView

 

        Me.DataGridView1.DataSource = DbDbase.DS.Tables("MiaTabella")

 

    End Sub

End Class

NB: Notare che in alcun luogo è stata indicata la stringa di connessione in quanto è stata generata automaticamente. E’ possibile comunque inizializzare l’istanza passando una stringa di connessione personalizzata.

 

Ed ora ecco il codice della classe GestDbase

Come utilizzarla: Creare un nuovo progetto di tipo Libreria di Classe e denominarla GestDbase copiare interamente il codice sotto riportato. Compilare la DLL.

Imports System

Imports System.Data.SqlClient

Imports System.Data.OleDb

 

Public Class GestDbase

 

    ' Classe per la gestione accessi a Database con ADO.NET

 

#Region "Dichiarazioni pubbliche"

 

    Public DS As DataSet

    Public MySQLReader As SqlDataReader

    Public MyOLEReader As OleDbDataReader

 

    ' Crea l'enumerazione relativa alla tipologia di Database da gestire

 

    Public Enum DbType

        OLEDb = 1

        SQL = 2

    End Enum

 

    ' Crea l'enumerazione relativa al posizionamento del Database da gestire

 

    Public Enum DbPosition

        LocalAttach = 1

        Server = 2

    End Enum

 

    ' Crea l'enumerazione relativa alla protezione del Database

 

    Public Enum DbProtection

        IntegratedSecutiry = 1

        AutenticationRequired = 2

    End Enum

 

    ' Crea l'enumerazione relativa alla modalità di creazione del DataTable

 

    Public Enum DTMode

        Schema = 1

        Fill = 2

    End Enum

 

 

#End Region

 

#Region "Dichiarazioni di classe"

 

    Private MySqlConnection As SqlConnection

    Private MyOLEConnection As OleDbConnection

 

    Private DbName As String

    Private SrvName As String

    Private StrConnectionString As String

    Private UName As String

    Private Pwd As String

 

    Private TypeDB As DbType

    Private PositionDB As DbPosition

 

#End Region

 

#Region "Proprietà"

 

    Public Property DatabaseName() As String

 

        ' Crea la Proprietà di classe indicante il nome del database di riferimento

        Get

            Return DbName

        End Get

        Set(ByVal Value As String)

            DbName = Value

        End Set

 

    End Property

 

    Public Property ServerName() As String

 

        ' Crea la Proprietà di classe indicante il nome del server SQL di riferimento

        Get

            Return SrvName

        End Get

        Set(ByVal Value As String)

            SrvName = Value

        End Set

 

    End Property

 

    Public Property Position() As DbPosition

 

        ' Crea la Proprietà di classe indicante la posizione del database

        Get

            Return PositionDB

        End Get

        Set(ByVal value As DbPosition)

            PositionDB = value

        End Set

    End Property

 

#End Region

 

#Region "Metodi"

 

    Public Function OpenDbase() As Boolean

 

        ' Apre la connessione al database dopo aver generato

        ' la stringa di connessione appropriata

 

        If TypeDB = DbType.SQL Then

 

            ' Database SQLServer

 

            MySqlConnection = New SqlConnection(GenerateString)

 

            Try

                MySqlConnection.Open()

                Return True

            Catch ex As Exception

                Return False

            End Try

        ElseIf TypeDB = DbType.OLEDb Then

 

            ' Database OLEDb

 

            MyOLEConnection = New OleDbConnection(GenerateString)

 

            Try

                MyOLEConnection.Open()

                Return True

            Catch ex As Exception

                Return False

            End Try

        End If

 

    End Function

 

    Public Sub CloseDbase()

 

        ' Se è aperto chiude la connessione

 

        If TypeDB = DbType.SQL Then

 

            ' Database SQLServer

 

            Try

                MySqlConnection.Close()

            Catch

                Exit Sub

            End Try

        Else

 

            ' Database OLEDb

 

            Try

                MyOLEConnection.Close()

            Catch

                Exit Sub

            End Try

        End If

 

 

    End Sub

 

#Region "Modalità Connessa"

 

    Public Function LeggiDati(ByVal SqlCmd As SqlCommand) As Boolean

 

        ' Database SQLServer

 

        Dim MySqlCommand As New SqlCommand

 

        MySqlCommand = SqlCmd

        MySqlCommand.Connection = MySqlConnection

 

        Try

            MySQLReader = MySqlCommand.ExecuteReader()

            Return True

        Catch ex As Exception

            Return False

        End Try

 

    End Function

 

    Public Function LeggiDati(ByVal OLECmd As OleDbCommand) As Boolean

 

        ' Database OLEDb

 

        Dim MyOLECommand As New OleDbCommand

 

        MyOLECommand = OLECmd

        MyOLECommand.Connection = MyOLEConnection

 

        Try

            MyOLEReader = MyOLECommand.ExecuteReader()

            Return True

        Catch ex As Exception

            Return False

        End Try

 

    End Function

 

    Public Function SalvaDati(ByVal SqlCmd As SqlCommand) As Integer

 

        ' Database SQLServer

 

        Dim MySqlCommand As New SqlCommand

 

        MySqlCommand = SqlCmd

        MySqlCommand.Connection = MySqlConnection

 

        Return MySqlCommand.ExecuteNonQuery()

 

    End Function

 

    Public Function SalvaDati(ByVal OLECmd As OleDbCommand) As Integer

 

        ' Database OLEDbServer

 

        Dim MyOLECommand As New OleDbCommand

 

        MyOLECommand = OLECmd

        MyOLECommand.Connection = MyOLEConnection

 

        Return MyOLECommand.ExecuteNonQuery()

 

    End Function

#End Region

 

#Region "Modalità disconnessa"

 

    Public Function CreaDataTable(ByVal SqlDA As SqlDataAdapter, ByVal SqlCmd As SqlCommand, ByVal TableName As String, ByVal Mode As DTMode) As Boolean

 

        ' Database SQLServer

 

        Dim MySqlCommand As New SqlCommand

 

        MySqlCommand = SqlCmd

        MySqlCommand.Connection = MySqlConnection

        MySqlCommand.CommandTimeout = 30

 

        Try

            SqlDA.SelectCommand = MySqlCommand

 

            If Mode = DTMode.Fill Then

                SqlDA.Fill(DS, TableName)

            ElseIf Mode = DTMode.Schema Then

                SqlDA.FillSchema(DS, SchemaType.Source, TableName)

            End If

 

            Dim CmdBuilder As SqlCommandBuilder = New SqlCommandBuilder(SqlDA)

 

            SqlDA.InsertCommand = CmdBuilder.GetInsertCommand

            SqlDA.DeleteCommand = CmdBuilder.GetDeleteCommand

            SqlDA.UpdateCommand = CmdBuilder.GetUpdateCommand

 

            Return True

        Catch ex As Exception

            Return False

        End Try

 

    End Function

 

    Public Function CreaDataTable(ByVal OLEDA As OleDbDataAdapter, ByVal OLECmd As OleDbCommand, ByVal TableName As String, ByVal Mode As DTMode) As Boolean

 

        ' Database OLEDb

 

        Dim MyOLECommand As New OleDbCommand

 

        MyOLECommand = OLECmd

        MyOLECommand.Connection = MyOLEConnection

        MyOLECommand.CommandTimeout = 30

 

        Try

            OLEDA.SelectCommand = MyOLECommand

 

            If Mode = DTMode.Fill Then

                OLEDA.Fill(DS, TableName)

            ElseIf Mode = DTMode.Schema Then

                OLEDA.FillSchema(DS, SchemaType.Source, TableName)

            End If

 

            Dim CmdBuilder As OleDbCommandBuilder = New OleDbCommandBuilder(OLEDA)

 

            OLEDA.InsertCommand = CmdBuilder.GetInsertCommand

            OLEDA.DeleteCommand = CmdBuilder.GetDeleteCommand

            OLEDA.UpdateCommand = CmdBuilder.GetUpdateCommand

 

            Return True

        Catch ex As Exception

            Return False

        End Try

 

    End Function

 

    Public Function SalvaDataTable(ByVal SqlDA As SqlDataAdapter, ByVal TableName As String) As Boolean

 

        ' Database SQLServer

 

        Try

            SqlDA.Update(DS, TableName)

            Return True

        Catch ex As Exception

            Return False

        End Try

 

    End Function

 

    Public Function SalvaDataTable(ByVal OLEDA As OleDbDataAdapter, ByVal TableName As String) As Boolean

 

        ' Database OLEDb

 

        Try

            OLEDA.Update(DS, TableName)

            Return True

        Catch ex As Exception

            Return False

        End Try

 

    End Function

 

#End Region

 

#End Region

 

#Region "Routine di Classe"

 

    Public Sub New(ByVal TipoDatabase As DbType)

 

        ' Overload del costruttore genera un nuovo Dataset

        ' e definisce il tipo di database da utilizzare

 

        DS = New DataSet

        TypeDB = TipoDatabase

 

    End Sub

 

    Public Sub New(ByVal TipoDatabase As DbType, ByVal UserName As String, ByVal Password As String)

 

        ' Overload del costruttore genera un nuovo Dataset

        ' e definisce il tipo di database da utilizzare

        ' e le credenziali di accesso al database

 

        DS = New DataSet

        TypeDB = TipoDatabase

        UName = UserName

        Pwd = Password

 

    End Sub

 

    Public Sub New(ByVal TipoDatabase As DbType, ByVal ConnectionString As String)

 

        ' Overload del costruttore genera un nuovo DataSet

        ' e definisce il tipo di database da utilizzare

        ' imposta inoltre la ConnectionString da utilizzare

 

        StrConnectionString = ConnectionString

 

    End Sub

 

    Private Function GenerateString() As String

 

        ' Nel caso in cui sia stata indicata la stringa di connessione la mantiene come valida

 

        If Not StrConnectionString = "" Then Return StrConnectionString

 

        ' Diversamente Genera la stringa di connessione in base alle proprietà impostate

 

 

        If TypeDB = DbType.SQL Then

 

            ' A. Database SqlServer

 

            If UName = "" Then

                ' Nel caso non vengano indicate credenziali

                If PositionDB = DbPosition.LocalAttach Then

                    ' Nel caso in cui si tratti di Database locale

                    Return "Data Source='" & SrvName & "'; Initial Catalog=; Integrated Security=True;AttachDBFileName='" & DbName & "'"

                ElseIf PositionDB = DbPosition.Server Then

                    ' Nel caso in cui si tratti di Database su server

                    Return "Server=" & SrvName & "; Initial Catalog=; Integrated Security=True;DataBase=" & DbName

                End If

            Else

                ' Nel caso in cui siano stati indicati Username e Password

                If PositionDB = DbPosition.LocalAttach Then

                    ' Nel caso in cui si tratti di Database locale

                    Return "Data Source=" & SrvName & ";Initial Catalog=;User ID='" & UName & "';Pwd='" & Pwd & "';AttachDBFileName='" & DbName & "'"

                ElseIf PositionDB = DbPosition.Server Then

                    ' Nel caso in cui si tratti di Database su server

                    Return "Server=" & SrvName & ";DataBase=" & DbName & ";User ID='" & UName & "';Pwd='" & Pwd & "'"

                End If

            End If

 

        ElseIf TypeDB = DbType.OLEDb Then

 

            ' B. Database OLEDB

 

            If UName = "" Then

                ' Nel caso non vengano indicate credenziali

                Return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DbName & ";"

            Else

                Return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DbName & ";User ID='" & UName & "';Pwd='" & Pwd & "'"

            End If

 

        End If

 

        Return ""

 

    End Function

 

    Protected Overrides Sub Finalize()

 

        MyBase.Finalize()

 

        ' Se è aperto chiude la connessione al database

 

        Try

            MySqlConnection.Close()

        Catch ex As Exception

            Exit Sub

        End Try

 

    End Sub

 

#End Region

 

End Class

 

Ribadisco che la classe è ancora in beta testing per cui non garantisco il perfetto funzionamento.

Ogni tipo di suggerimento, miglioramento o segnalazione di bugs è gradito.

 

Badalin Alessandro

26 agosto 2007

Categoria: VB.NET
domenica, 26 ago 2007 Ore. 01.40
Ora e Data
Statistiche
  • Views Home Page: 29.549
  • Views Posts: 38.385
  • Views Gallerie: 3.820
  • n° Posts: 11
  • n° Commenti: 10
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003