WPC 2008
 Cerca nei blog
nov20

Written by:Daniele Lembo
giovedì 20 novembre 2008 8.47 

A chi non è mai capitato di dover effettuare operazioni (interrogazioni a db e inserimenti) legate tra di loro e di doversi servire di una transazioni per gestire la concorrenzialità sulla modifica dei dati da più connessioni?
 


Nel caso di DNN è abbastanza semplice prevedere la possibilità di utilizzare connessioni in transazione per effettuare operazioni tra di loro collegate ad esempio se ci fosse la necessità di leggere un dato da una tabella e scriverlo su un'altra evitando che possa essere modificato nel frattempo. in alternativa all'utilizzo di un store procedure possiamo implementare un metodo nel nostro data provider come quello che segue:

 

Public Overrides Function MyTransactionFunction() As string

 Dim Exceptions As String = ""
 Dim strQuery As String = ""
 Dim s As StringBuilder = New StringBuilder("")
 Dim Conn As New SqlConnection(ConnectionString)
 
 Conn.Open()
 Try
  Dim Trans As SqlTransaction = Conn.BeginTransaction
  Dim IgnoreErrors As Boolean
  Dim ReturnedValue as integer
  Try
   'Prima query
   s.Append("select myval ")
   s.Append(" from " & DatabaseOwner & ObjectQualifier & "MyTab ")
   ReturnedValue = SqlHelper.ExecuteScalar(ConnectionString, CommandType.Text, s.ToString)
  
   'Seconda query
   s = New StringBuilder("")
   s.Append(" insert into ")
   s.Append(DatabaseOwner & ObjectQualifier)
   s.Append("My_Table ")
   s.Append(" (col1,ReturnedValue) ")
   s.Append(" values (")
   s.Append(val1)
   s.Append(",")
   s.Append(ReturnedValue)
   s.Append("')")
   strQuery = s.ToString()
   sqlDR = SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.Text, (strQuery))

  Catch objException As SqlException
   Exceptions += objException.ToString & vbCrLf & vbCrLf & strQuery & vbCrLf & vbCrLf
  End Try

  If Exceptions.Length = 0 Then
   Trans.Commit()
   Return "1"
  Else
   Trans.Rollback()
   Exceptions += "Esecuzione SQL fallita. La transazione è stata annullata." & vbCrLf & vbCrLf & strQuery & vbCrLf & vbCrLf
   Return Exceptions
  End If
 Catch objException As SqlException
  Exceptions += objException.ToString & vbCrLf & vbCrLf & strQuery & vbCrLf & vbCrLf
  objExeptionLog.AddLog(objException)
 Finally
  Conn.Close()
 End Try

 Return Exceptions
End Function
 

Come si vede dal codice viene istanziata una transazione e utilizzata sulla connessione al db per tutte le operazioni effettuate nel metodo. In questo modo è semplice gestire il rollback in caso di eventuali errori e il commit in caso di successo.

Tags:

1 comment(s) so far...

R: Eseguire query in transazione

Questo se stiamo programmando in una logica DAL+, vedi articolo, altrimenti in una logica DAL bisogna gestire una proprietà nella classe di accesso ai dati.

By Andrea Giusti on  giovedì 20 novembre 2008 13.06
Invia questa pagina ad un amico