I
Microsoft Application Block sono una serie di componenti sviluppati sempre da Microsoft (o società partner) per ottimizzare e rendere solide le applicazioni che si producono, ce ne sono diversi, da quello che gestisce la Cache, a quello che gestisce l'Exception e vari altri, in questo articolo ci occuperemo del
Data Access che ci permette di accedere al database di Sql Server ottimizzando il codice.
I Data Access Blocks utilizzano
ADO.NET, ma non lo sostituiscono, ci permettono di eseguire comandi o storeprocedure ottimizzando il codice.
Per prima cosa per poterli utilizzare bisogna scaricarli e lo facciamo da questo link :
http://www.microsoft.com/downloads/details.aspx?FamilyId=F63D1F0A-9877-4A7B-88EC-0426B48DF275&displaylang=en ">Data Access Application Block
viene scaricato un file .msi che una volta installato estrae la DLL che ci interessa la
Microsoft.ApplicationBlocks.Data.dll; questa DLL la possiamo utilizzare senza aver bisogno di licenze e senza limiti di tempo.
I Data Access ci permettono di :
? Richiamare StoreProcedure o Transact-Sql
? Specificare e salvare i nostri parametri
? Ritornano SqlDataReader, DataSet o XmlReader
? Utilizzano i Dateset TipizzatiVediamo un po' di codice in azione:
Dopo aver referenziato la nostra
DLL e averla richiamata tramite
using/Imports possiamo utilizzare la classe
SqlHelper che è predisposta all'esecuzione dei comandi ed espone
13 metodi statici(shared in VB.NET) così da non dover istanziare tale classe.
Vediamo quindi come è possibile
recuperare un DataSet con una sola riga di codice:
Utilizziamo come il solito il mitico database "Northwind":
C#
System.Data.DataSet ds = SqlHelper.ExecuteDataset(ConnectionString,System.Data.CommandType.Text, "Select * from orders ");
VB.NET
Dim ds as Dataset = SqlHelper.ExecuteDataset(ConnectionString,System.Data.CommandType.Text, "Select * from orders ");
Lo stesso procedimento si può utilizzare con il
DataReader:
C#
SqlDataReader reader = SqlHelper.ExecuteReader(ConnectionString,System.Data.CommandType.Text, "Select * from orders");
VB.NET
Dim reader as SqlDataReader = SqlHelper.ExecuteReader(ConnectionString,System.Data.CommandType.Text, "Select * from orders ")
Come vedete
non s?istanzia nessun oggetto Connection e non si gestisce né l'apertura né la chiusura della connessione,
allora come si comporta il componente?
In due diversi in modi:
Nel caso del
DataSet la connessione viene aperta quando si richiede il DataSet e chiusa nel momento in cui viene restituito, mentre per il
DataReader viene chiusa nel stesso momento in cui viene chiuso il DataReader, è come quando viene utilizzato il metodo
ExecuteReader(Connection.Close).
Di default quando si chiama un metodo si passa il nome di una
Stored Procedure, se invece dobbiamo passargli un comando Sql(come nel nostro caso), dobbiamo specificarlo in questo modo
System.Data.CommandType.Text.
Sia il metodo
ExecuteDataset che il metodo
ExecuteReader hanno diversi overloading che accettano anche:
?
SqlConnection, Nome della Store Procedure, un'array di object che sono i parametri da passare alla Stored Procedure
?
SqlTransaction, Nome della Store Procedure, array di SqlParameter
Questo componente ci dà la possibilità sia di ottimizzare il codice come abbiamo visto, ma anche di avere il massimo della personalizzazione, utilizzando sia la connessione, che la transazione, in base alle esigenze e alle situazioni, inserendo a "piacimento" un'array d'oggetti generici oppure un'array di
SqlParameter.
Stesso discorso vale se dobbiamo lanciare un comando di Insert/Update/Delete:
SqlHelper.ExecuteNoQuery(connessione,"StoreProcedure",parametri)I Data Access possono restituire anche un
XmlReader, in un precedente Tip (
http://www.dotnethell.it/Tips/Tip.aspx?TipID=113 ">Restituire un file XML tramite SQL Server) abbiamo gia visto come recuperare i valori in formato
XML da SQL Server, ed è lo stesso "meccanismo" utilizzato dal comando
ExecuteXmlReader:
SqlHelper.ExecuteXmlReader(SqlConnection,System.Data.CommandType.Text, "Select * from orders")Il commando
ExecuteXmlReader a differenza degli altri che abbiamo visto in precedenza deve avere o un oggetto
SqlConnection o un oggetto
SqlTransaction, perchè non ha la possibilità di chiudere da solo la connessione.
In dettaglio tutti i metodo usati dalla classe
SqlHelper:
? CreateCommand
? ExecuteDataset
? ExecuteNoQuery
? ExecuteReader
? ExecuteReaderTypedParams
? ExecuteScalar
? ExecuteScalarTypedParams
? ExecuteXmlReader
? ExecuteXmlReaderTypedParams
? FillDataset
? UpdDataset
I metodi con
"TypedParams" sono utilizzati per i
Dataset Tipizzati.
I Data Access oltre alla classe SqlHelper contiene anche la classe
SqlHelperParamerCache, che serve per gestire i parametri.
Questa classe espone tre metodi
? CacheParameterSet
? GetCachedParameterSet
? GetSpParameterSetCacheParameterSetQuesto metodo serve a ad inserire in una
HastTable un array di SqlParamater, per poter utilizzare questo metodo bisogna specificare la ConnectionString e il nome della Stored Procedure(o Transact-SQL)
SqlHelperCachedParameterSet.CacheParameterSet("connectionstring","StoredProcedure",ArraySqlParameter)GetCachedParameterSetServe per recuperare dalla cache i parametri settati e restituisce un array di SqlParameter
SqlHelperCachedParameterSet.GetCachedParameterSet("connessione","storedprocedure")
GetSpParameterSetRestituisce un array di SqlParameter dalla Stored Procedure indicata, questo metodo utilizza al suo interno il
SqlCommandBuilder come già visto in un altro Tip (
http://www.dotnethell.it/Tips/Tip.aspx?TipID=75 ">Come recuperare i parametri da una Stored Procedure con ADO.NET ? )
SqlHelperCachedParameterSet.GetSpParameterSet("connessione","storeprocedure")
ConclusioniCome avete potuto vedere questo componente utilizza in pieno le classi e i metodi usati con
ADO.NET, quindi non vi risulterà complicato lavorarci. Possiamo gestire i parametri passandoli sia come oggetti sia come array di SqlParameter, potendoli anche inserire in una nostra
"cache". Risultano molto utili e comodi in ambienti con più programmatori dove bisogna rispettare uno standard di accesso al Database; inoltre come avrete potuto intuire con gli
Application Blocks viene ottimizzato al massimo il codice evitando le inutili ripetizioni.