10 buoni motivi per passare da ASP ad ASP.NET 2.0 - Parte I

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Le differenze nell'accesso ai dati

L'area dove si trova maggiore difficoltà è in tutta franchezza quella dell'accesso ai dati. Se il modello event driven tutto sommato è facile da abbracciare, le differenza tra ADO ed ADO.NET, ma soprattutto la presenza del DataBinding, possono turbare i sonni di molti sviluppatori ASP.

Il concetto che sta alla base di ASP.NET è quello di avere un certo tipo di controls, che sono comunemente detti data controls, che consentono di diminuire drasticamente il codice necessario ad estrarre dati da un database e questo è quanto più vero se abbinato ad ASP.NET 2.0, dove l'approccio dichiarativo (composto cioè di markup e non di codice) prende davvero il sopravvento.

Non è questa la sede giusta per disquisire sul fatto che in un mondo orientato agli oggetti non andrebbe mai annegata la parte di accesso ai dati nella pagina, ma è ovvio che con ASP la cosa rappresenterebbe non poche problematiche: le classi si possono creare in maniera decente solo utilizzando COM, il che vuol dire rendere il deployment quasi simile ad un incubo.

Dunque, fermo restando che la cosa migliore è suddividere in strati la propria applicazione, cerchiamo di capire, con esempi, come portare la logica di accesso ai dati da una pagina ASP ad una ASP.NET. Per capire al meglio quanto sia differente ADO.NET (e soprattutto, in cosa consista il concetto di managed provider, essenziale per comprendere il codice) vi invito alla lettura di questo articolo.

Con ASP l'oggetto che si utilizza è il recordset, che di default è un cursore read-only e forward-only verso i dati, consente cioè di leggerli in una modalità che consente di scorrere solo in avanti i risultati.

Questo approccio è comunque disponibile con ADO.NET e più precisamente attraverso l'utilizzo dell'oggetto DataReader, anche se di fatto viene usato solo quando si creano delle classi di business, perché nelle pagine vere e proprio c'è la possibilità di utilizzare i nuovi DataSource controls, che si occupano di nascondere la logica di connessione ed estrazione dati, in maniera trasparente.

Vediamo quindi un esempio:

Classic ASP

<%
strConn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " & Server.MapPath("test.mdb")


Set conn = Server.CreateObject("ADODB.Connection")
conn.Open StrConn
 
SQL = "SELECT * FROM Tabella"
 
Set rs = Server.CreateObject("ADODB.Recordset")
Rs.Open SQL, Conn
 
Do Until rs.Eof = True
  ' Mostra riga corrente
  Response.write "<li>" & rs("nomecampo") & "</li>"
 
  ' Vai alla prossima riga
  rs.movenext
Loop
 
' Libero risorse
rs.Close
set rs = Nothing
 
conn.Close
Set conn = Nothing
%>

ASP.NET

<%@Import Namespace="System.Data" %>
<%@Import Namespace="System.Data.SqlClient" %>
<SCRIPT language="VB" runat="server">
 
Sub Page_Load()
  ' query Sql
  Dim query As String = "SELECT * FROM tabella"
 
  ' connessione
  Dim conn As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
  conn.Open()
 
  ' oggetto command
  Dim command As SqlCommand = New SqlCommand(query, conn)
 
  ' esecuzione della query e salvataggio nell'oggetto datareader
  Dim reader As SqlDataReader = command.ExecuteReader()
 
  ' BataBinding
  MyRepeater.DataSource = reader
  MyRepeater.DataBind()
 
  ' libero le risorse
  reader.Close()
  conn.Close()
End Sub
 
</SCRIPT>

<ASP:Repeater id="MyRepeater" runat="server">
<ItemTemplate>
  <li><%# Eval("campo") %></li>
</ItemTemplate>
</ASP:Repeater>

La verà differenza sta ancora una volta nell'uso dei controls, che ci consentono di dire addio a cicli per estrarre i dati (con l'eventuale possibilità di dimenticarci di chiudere correttamente il loop), in favore di un approccio più pulito. In particolare, la presenza del controllo repeater ci consente di fare la stessa cosa che avremmo fatto con Classic ASP: ripetere i dati finchè ce ne sono.

Quella sintassi particolare, che racchiude un'istruzione all'interno di <%# %>, viene detta di binding, perché viene valutata quando viene invocato il metodo DataBind() del controllo che la contiene.

Un problema che trova in genere chi viene da ASP è come manipolare un dato per trasformarlo prima di visualizzarlo. Non c'è niente di più semplice:

  <li><%# Trasforma(Eval("campo")) %></li>

dove Trasforma() è ovviamente una normalissima funzione che restituisce una stringa.

Con ASP.NET 2.0 si può anche fare a meno di utilizzare questa forma, optando per un semplice controllo SqlDataSource, che incapsula tutta la logica:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4"
DataKeyNames="au_id" DataSourceID="SqlDataSource1" >
<Columns>
  <asp:BoundField DataField="colonna" HeaderText="colonna" SortExpression="colonna" />
  ...
  <asp:BoundField DataField="colonna" HeaderText="colonna" SortExpression="colonna" />
</Columns>
</asp:GridView>
   
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:conn %>"
ProviderName="<%$ ConnectionStrings:pubsConnectionString1.ProviderName %>"
SelectCommand="SELECT * FROM Tabella">
</asp:SqlDataSource>

Come già detto, questo approccio però non è in genere consigliato, perché si rischia di tenere troppo accoppiata la logica di accesso ai dati alla pagina e pertanto va favorito l'utilizzo di un architettura a 3 livelli, dove la logica di accesso ai dati risiede in classi ad hoc. Tuttavia all'inizio può rappresentare un giusto compromesso ed è possibile trovare un grande aiuto nel designer visuale, che consente di definire le opzioni di interrogazione del database e, grazie all'uso del control GridView, è anche in grado di supportare in modo automatico le funzionalità di paginazione, ordinamento, filtro e modifica dei dati.

E se vi chiedete con quali database funziona, la risposta è praticamente con tutti. Anche con MySQL, grazie a questo provider scritto dal nostro Marco Leoncini.

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC