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