14

我需要制作一个通用记录器来记录某些插入/更新语句,以便我的测试人员可以验证插入的数据是否正确。

我的第一个想法是,我将只使用一个接受 DynamicParameters 的函数,然后我将遍历 DynamicParameters 以生成一个字符串来列出参数的名称和值,并使测试人员更容易阅读它们。

不幸的是,Dapper.DynamicParameters 不包含“GetEnumerator”的公共定义

这是我希望做的基本示例:

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

4 回答 4

18

Try:

            var sb = new StringBuilder();
            foreach (var name in p.ParameterNames)
            {
                var pValue = p.Get<dynamic>(name);
                sb.AppendFormat("{0}={1}\n", name, pValue.ToString());
            }
于 2012-05-09T05:46:29.873 回答
7
    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();
    }
于 2015-12-03T00:37:45.603 回答
1

与 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])));
于 2020-10-06T23:07:15.180 回答
-3

以防万一,

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

为我工作。

于 2014-12-09T18:27:22.907 回答