4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>
ASP e le transazioni
Abbiamo stabilito che l'uso delle transazioni è cosa buona e giusta, rimane da vedere come utilizzarle nel lavoro di tutti i giorni.
Per cominciare occorre stabilire che il supporto delle transazioni non è fornito da tutti i database, per esempio i database di tipo file-based (ISAM) di vecchia data non comprendono l'utilizzo delle transazioni, questo anche perché non c'è una 'intelligenza' dietro al database.
Per esempio i database .DBF o Btrieve non forniscono supporto alcuno per le transazioni.
I database più moderni invece prevedono l'utilizzo delle transazioni, tra i quali Microsoft Access, Microsoft SQL Server, Oracle (tutte le versioni), Sybase e vari altri che adesso non stò ad indicare.
A questo punto abbiamo due vie per utilizzare le transazioni con questi sistemi: utilizzare il loro supporto interno direttamente usando BEGIN TRANSACTION / COMMIT o l'equivalente fornitoci da ODBC (ADO) per avviare e concludere le transazioni, oppure utilizzare il Microsoft Transaction Server (dove installato) per gestire le transazioni a livello di script.
Utilizzare il supporto interno
Se stiamo usando SQL Server o Oracle e sappiamo che andremo ad utilizzare solo questo, la cosa migliore è quella di programmare direttamente il server creando delle Stored Procedure per effettuare gli aggiornamenti, quindi chiamarle da ASP.
In questo modo evitiamo problemi e rendiamo molto più efficiente il tutto.
Se vogliamo però rendere più portabile il nostro codice, non rimane che utilizzare i meccanismi di ADO/ODBC per accedere alle transazioni, tenendo a mente pero' che se il database non supporta le transazioni, il nostro codice diventa inutile, in quanto i metodi BeginTrans e RollBackTrans non fanno assolutamente nulla.
Per utilizzare questi meccanismi occorre includere le operazioni da rendere transazionali all'interno delle istruzioni
Connection.BeginTrans
..
Istruzioni di modifica del database
..
Connection.CommitTransIl grosso problema di ASP è sapere quando è il caso di fare un Rollback, cioè rendersi conto se si è verificato o meno un errore durante la scrittura dei dati. Effettivamente quello che manca ad ASP è una buona gestione degli errori sul tipo di Visual Basic o di altri linguaggi (gestione delle exception per esempio), purtroppo l'unica soluzione è mettere un bel On Error Resume Next all'inizio del codice e poi testare a mano ogni volta se la connessione ha riportato degli errori, verificando se Connection.Errors.Count è maggiore di 0.
Facciamo un esempio pratico: abbiamo una paginetta che visualizza i dati da una tabella di database e chiede i dati per aggiungere un record nella stessa tabella. Durante l'aggiunta del record vogliamo anche aggiornare una data su tutti i record alla data odierna.
La paginetta si presenta più o meno così:
<HTML>
<HEAD>
<TITLE>Esempio di Transazione con ASP</TITLE>
<BODY>
Esempio d'uso di transazioni con ASP.<P>
<%
Dim rs
Dim sql
Dim conn
Dim link
' disattivo la gestione automatica degli errori
On Error Resume Next
' apro la mia connessione
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "AspSamples"
' disegno la tabellina per immettere i record
%>
<B>Immettere i dati per il documento da aggiungere</B><BR>
<FORM METHOD=POST ACTION=default.asp>
<TABLE>
<TR>
<TD>Nome del documento</TD><TD><INPUT TYPE=TEXT NAME="Documento"></TD>
</TR>
<TR>
<TD>Descrizione</TD><TD><INPUT TYPE=TEXT NAME="Descrizione"></TD>
</TR>
<TR>
<TD>Titolo</TD><TD><INPUT TYPE=TEXT NAME="Titolo"></TD>
</TR>
<TR>
<TD>Data</TD><TD><INPUT TYPE=TEXT NAME="Data">
<B>nota:</B> questa data viene aggiornata su tutti i record</TD>
</TR>
</table>
<INPUT TYPE="SUBMIT">
</FORM>
<%
' **** AGGIORNAMENTO DATI *****
If Request("Data") = "" And Request("Documento") = "" Then
' nessun aggiornamento da fare
Else
' eseguo l'aggiornamento dei dati
sql = "INSERT INTO DocumentiAsp (Documento, Descrizione, Titolo) VALUES ("
sql = sql & "'" + Request("Documento") & "',"
sql = sql & "'" + Request("Descrizione") & "',"
sql = sql & "'" + Request("Titolo") & "')"
' attivo la transazione
conn.BeginTrans
' inserimento del record
conn.Execute sql
' aggiornamento delle date
conn.Execute "UPDATE DocumentiAsp SET Data=#" & Request("Data") & "#"
' verifico se ci sono stati degli errori
If conn.Errors.Count > 0 Then
' errori: annullo tutto
conn.RollBackTrans
Response.Write "<B>Errore nell'aggiornamento:</b><BR>"
Response.Write conn.Errors.Item(0) & "<P>"
Else
' tutto bene, porto avanti e concludo la transazione
conn.CommitTrans
Response.Write "Aggiornamento concluso."
End If
End If
' visualizzo l'elenco dei record.
Set rs=conn.Execute("SELECT Documento, Descrizione, Data FROM DocumentiAsp")
If rs.EOF And rs.BOF Then
Response.Write "Nessun documento presente<BR>"
Else
Response.Write("<TABLE>")
Do While Not rs.EOF
Response.Write "<TR><td>"
Response.Write rs.Fields("Documento")  
Response.Write "</Td><td>"
Response.Write rs.Fields("Descrizione")  
Response.Write "</Td><td>"
Response.Write rs.Fields("Data")  
Response.Write "</Td></tr>"
rs.MoveNext
Loop
Response.Write("</TABLE>")
End If
' chiudo e pulisco
rs.Close
Set rs=Nothing
conn.Close
Set conn=Nothing
%>
</BODY>
<HTML>In sostanza abbiamo due 'aree' distinte: la parte superiore visualizza la maschera di inserimento dei dati, la parte inferiore mostra i dati già presenti.
La parte 'clue' del codice è quella indicata come aggiornamento dati. In pratica che si fa: si attiva la transazione richiamando conn.BeginTrans (dove conn è la mia connessione), si eseguono gli aggiornamenti, quindi si verifica se ci sono stati degli errori. Questa è la parte rognosa, in quanto l'unico modo per farlo è quello di testare se conn.Errors.Count è maggiore di zero. Per poter fare questo però è necessario aggiungere l'istruzione On Error Resume Next, per evitare che il codice si blocchi quando riceve un errore dalla connessione.
Se si sono verificati degli errori, viene annullata la transazione (mediante Rollback), altrimenti si effettua la commit e tutto và a posto.
4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Stampa
Download 



