2012-05-08 22 views
8

テスターが挿入されているデータが正しいことを確認できるように、特定の挿入/更新ステートメントを記録するために汎用ロガーを作成する必要があります。Dapper DynamicParametersオブジェクトを反復処理する方法はありますか?

DynamicParametersを受け入れた関数を使用するだけで、パラメータの名前と値をリストし、テスターの読みやすさを向上させる文字列を生成することができます。

残念ながら、Dapper.DynamicParametersはここ

を "GetEnumeratorメソッド" の公開定義が含まれていませんが、私がやることを望んでいたものの基本的な例です。

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

答えて

5

試してみてください。

  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

ありがとうございました。ところで、Dapperが大好きなので、時間と頭痛がひどくなってしまった。上のコードを試してみると、 'Dapper.DynamicParameters'に 'ParameterNames'の定義が含まれていません。 – SLoret

+7

@Sam Saffronあなたのコードに従うと、次の例外が発生します。[NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。] c:\ Dev \ Dapper \のDapper.DynamicParameters.Get(String name) Dapper \ SqlMapper.cs:2574 –

+2

Garyと同じ例外がここにあります。これに関する更新はありますか? –

-1

ちょうどの場合、

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); 
} 

私のために働いた。

+0

これは、抽象化をカプセル化したい場合に役立ちません。これをFormatDynamicParametersというメソッドに入れると、すべてのコンシューマがDynamicParametersのインスタンスと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

SqlMapper.IParameterLookupへのキャストは、IDbConnectionインスタンスで使用される前にコレクションを反復処理しようとしていたときにNullReferenceExceptionを回避するのに役立ちました。ありがとう! –

+0

年後 - これで解決しました。 –

+0

これはありがたいことですが、私たちのDapperラッパーの呼び出しで正しい値に配線されている正しいパラメータをアサートした単体テストを書くときに役立ちました – nrjohnstone

関連する問題