2013-03-12 5 views
6

Sono un ragazzo di vb.net e ho difficoltà a leggere C#. Ho compilato C# Dapper in una DLL e l'ho usato come app. La mia preoccupazione principale è che penso di dover modificare l'origine per integrare per impostazione predefinita il Transient Fault Framework per SQL Azure in ogni query SQL.Come implementare SQL Azure Transient Fault Framework per Dapper?

Posso aggiungere la logica dei tentativi sul livello di connessione perché è in cima al dapper, ma non al livello di query di esecuzione che è incorporato nella classe di drapper.

Chiunque lo ha già fatto?

* UPDATE *

funziona utilizzando solo ReliableSqlConnection in cima chiamata Dapper gestirà una logica di tentativi sulla non esecuzione di query?

Ecco il codice di esempio di tentativi da MS con la colpa transietn hanling

using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling; 
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.AzureStorage; 
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure; 
using System.Data; 

... 

using (ReliableSqlConnection conn = new ReliableSqlConnection(connString, retryPolicy)) 
{ 
conn.Open(); 

IDbCommand selectCommand = conn.CreateCommand(); 
selectCommand.CommandText = 
    "UPDATE Application SET [DateUpdated] = getdate()"; 

// Execute the above query using a retry-aware ExecuteCommand method which 
// will automatically retry if the query has failed (or connection was 
// dropped). 
int recordsAffected = conn.ExecuteCommand(selectCommand, retryPolicy); 

} 

qui è la parte di codice di Dapper eseguire, lo stesso nome è usato ma credo che sia una consuetudine eseguire la funzione

private static int ExecuteCommand(IDbConnection cnn, IDbTransaction transaction, string sql, Action<IDbCommand, object> paramReader, object obj, int? commandTimeout, CommandType? commandType) 
    { 
     IDbCommand cmd = null; 
     bool wasClosed = cnn.State == ConnectionState.Closed; 
     try 
     { 
      cmd = SetupCommand(cnn, transaction, sql, paramReader, obj, commandTimeout, commandType); 
      if (wasClosed) cnn.Open(); 
      return cmd.ExecuteNonQuery(); 
     } 
     finally 
     { 
      if (wasClosed) cnn.Close(); 
      if (cmd != null) cmd.Dispose(); 
     } 
    } 
+0

Posso confermare che io certamente non ho - anche se personalmente avrei aspettarsi di implementare la gestione transitoria degli errori * attorno a * dapper piuttosto che all'interno. –

+0

Sì, ma intorno a dapper sarebbe efficace per la connessione stessa, ma la logica integra anche ExecuteReaderWithRetry, o NonQuery, ecc. L'intero con ritardi a livello di esecuzione deve essere integrato nel dapper se ho capito bene. –

+1

Sì, ma potresti semplicemente scrivere un metodo di estensione "fai con nuovo tentativo" ... –

risposta

2

Si consiglia di avvolgere il numero di tentativi attorno a Dapper, preferibilmente utilizzando il metodo RetryPolicy.ExecuteAction. In questo modo sia la chiamata OPEN per la connessione e il comando stesso saranno processati nuovamente utilizzando il criterio TFH tentativo:

Ad esempio:

 SqlRetryPolicy.ExecuteAction(() => 
     { 
      // Place Dapper ExecuteCommand here: e.g. 
      ExecuteCommand(conn, trans, ...) 
     });