Transazioni con Data Access Application Block: non mi convince!

di Riccardo Golia, in DotNet,

In un progetto a cui sto partecipando in questo periodo si è deciso di utilizzare il Data Access Application Block per gestire le chiamate allo strato dati. Oggi discutevo con uno dei miei colleghi circa l'utilizzo delle transazioni ADO.NET congiuntamente al DAAB. Una delle cose mi hanno lasciato pensare (e un po' perplesso) è il fatto che per lanciare il metodo statico ExecuteNonQuery(SqlTransaction, CommandType, string, SqlParameter[]) occorre dichiarare e istanziare tramite using() la connessione al DB al di fuori del metodo, nell'ambito del codice dello strato da cui parte la chiamata. L'esempio riportato nella documentazione tecnica di DAAB è questo; come si può vedere è il codice chiamante che dichiara, istanzia e apre/chiude la connessione al DB.

// create and open the connection
SqlConnection con = new SqlConnection("Server=(local); Database=Northwind;
   Integrated Security=True;");

con.Open();

// create the SqlTransaction object and start a new transaction
SqlTransaction tran = con.BeginTransaction();

try
{
  // use a parameter array of SqlParameter objects
  SqlHelper.ExecuteNonQuery(tran,
     CommandType.StoredProcedure,"InsertDemographic",
     new SqlParameter("@CustomerTypeID", "FREQUENT"),
     new SqlParameter("@CustomerDesc", "Frequent orderer"));

  // use a SqlParameter array
  SqlParameter[] arParams = new SqlParameter[2];
  arParams[0] = new SqlParameter("@CustomerID", "ANATR");
  arParams[1] = new SqlParameter("@CustomerTypeID","FREQUENT");

  SqlHelper.ExecuteNonQuery(tran,
     CommandType.StoredProcedure,
     "InsertCustomerDemographic",
     arParams);

  // commit the transaction if there are no errors
  tran.Commit();

  MessageBox.Show("Demographic data added successfully");
}
catch(Exception ex)
{
  // rollback the transaction if there are errors
  tran.Rollback();
  MessageBox.Show(ex.Message.ToString());
}
finally
{
  // close the connection
  con.Close();
}

Quello che mi chiedo ora è questo... Se per utilizzare le transazioni devo creare la connessione al DB nell'ambito del codice chiamante (per esempio dentro alla logica di business), come posso pensare di ottenere un perfetto layering e una scalabilità degna di questo nome usando DAAB? La cosa mi lascia perplesso, credo che la soluzione proposta non sia ottimale, soprattutto in ambito di sviluppo enterprise, dove gli aspetti di scalabilità e stratificazione applicativa sono molto importanti e spesso un prerequisito non prescindibile.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese