我需要创建一个通用记录器来记录某些插入/更新语句,以便我的测试人员可以验证插入的数据是否正确。
我的第一个想法是我只使用一个接受DynamicParameters的函数,我会通过DynamicParameters来生成一个字符串来列出参数的名称和值,并使它们更容易为测试人员阅读。
不幸的是,Dapper.DynamicParameters不包含“GetEnumerator”的公共定义
这是我希望做的基本例子:
string myFormattedListofParameters = "";
foreach (var p in myDynamicParameters)
{
myFormattedListofParameters += p.Name + "=" + p.Value.ToString();
}
答案 0 :(得分:8)
尝试:
var sb = new StringBuilder();
foreach (var name in p.ParameterNames)
{
var pValue = p.Get<dynamic>(name);
sb.AppendFormat("{0}={1}\n", name, pValue.ToString());
}
答案 1 :(得分:6)
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();
}
答案 2 :(得分:0)
与Linq一行:
string.Join(", ", from pn in sprocParams.ParameterNames select string.Format("@{0}={1}", pn, (sprocParams as SqlMapper.IParameterLookup)[pn]))
我正在使用它来登录log4net:
Log.InfoFormat("Exec {0} {1}", storedProc, string.Join(", ", from pn in sprocParams.ParameterNames select string.Format("@{0}={1}", pn, (sprocParams as SqlMapper.IParameterLookup)[pn])));
答案 3 :(得分:-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);
}
为我工作。