2012-05-08 8 views
8

Ho bisogno di creare un logger generico per registrare alcune istruzioni di inserimento/aggiornamento in modo che i miei tester possano verificare che i dati inseriti siano corretti.Esiste comunque l'iterazione di un oggetto Dapper DynamicParameters?

Il mio primo pensiero è stato che vorrei solo usare una funzione che ha accettato DynamicParameters e vorrei foreach attraverso le DynamicParameters per generare una stringa di elencare nome e il valore del parametro e renderli più facili da leggere per i tester.

Purtroppo, Dapper.DynamicParameters non contiene una definizione pubblica per "GetEnumerator"

Ecco esempio di base di quello che speravo di fare:

string myFormattedListofParameters = ""; 
foreach (var p in myDynamicParameters) 
{ 
myFormattedListofParameters += p.Name + "=" + p.Value.ToString(); 
} 

risposta

5

Prova:

  var sb = new StringBuilder(); 
      foreach (var name in p.ParameterNames) 
      { 
       var pValue = p.Get<dynamic>(name); 
       sb.AppendFormat("{0}={1}\n", name, pValue.ToString()); 
      } 
+0

Grazie per l'aiuto Sam. A proposito, adoro Dapper, mi ha risparmiato così tanto tempo e mal di testa. Quando provo il codice sopra ho capito ... 'Dapper.DynamicParameters' non contiene una definizione per 'ParameterNames'. – SLoret

+7

@Sam Saffron Ricevo la seguente eccezione quando seguo il codice: [NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto.] Dapper.DynamicParameters.Get (nome stringa) in c: \ Dev \ Dapper \ Dapper \ SqlMapper.cs: 2574 –

+2

Sto ottenendo questa stessa eccezione di Gary qui. Qualche aggiornamento su questo? –

-1

Per ogni evenienza,

var pmaster = new Dapper.DynamicParameters();        
SortedList l = new SortedList(); 
l.Add("param1", object1); 
l.Add("param2", object2); 
l.Add("param3", object3); 
l.Add("param4", object4); 

foreach(var key in l.Keys) 
{ 
    var val = l[key]; 
    pmaster.Add(key.ToString(), val); 
} 

ha funzionato per me.

+0

Questo non sarebbe d'aiuto in situazioni in cui voglio incapsulare l'astrazione lontano. Se dovessi inserire questo in un metodo, ad esempio FormatDynamicParameters, richiederei che tutti i miei utenti passino in un'istanza di DynamicParameters e un'implementazione di IList. –

5
string ParametersToString(DynamicParameters parameters) 
    { 
     var result = new StringBuilder(); 

     if (parameters != null) 
     { 
      var firstParam = true; 
      var parametersLookup = (SqlMapper.IParameterLookup)parameters; 
      foreach (var paramName in parameters.ParameterNames) 
      { 
       if (!firstParam) 
       { 
        result.Append(", "); 
       } 
       firstParam = false; 

       result.Append('@'); 
       result.Append(paramName); 
       result.Append(" = "); 
       try 
       { 
        var value = parametersLookup[paramName];// parameters.Get<dynamic>(paramName); 
        result.Append((value != null) ? value.ToString() : "{null}"); 
       } 
       catch 
       { 
        result.Append("unknown"); 
       } 
      } 

     } 
     return result.ToString(); 
    } 
+0

Il cast in SqlMapper.IParameterLookup mi ha aiutato a evitare l'eccezione NullReferenceException che stavo ricevendo quando tentavo di eseguire iterazioni nella raccolta prima di essere utilizzata su un'istanza IDbConnection. Grazie! –

+0

Anni dopo: questo lo risolse. –

+0

Grazie per questo, è stato utile durante la scrittura dei test di unità che hanno asserito i parametri corretti dove sono stati cablati i valori corretti nelle chiamate al nostro wrapper Dapper – nrjohnstone

Problemi correlati