无论如何迭代Dapper DynamicParameters对象?

SLo*_*ret 9 dapper

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

我的第一个想法是我只使用一个接受DynamicParameters的函数,我会通过DynamicParameters来生成一个字符串来列出参数的名称和值,并使它们更容易为测试人员阅读.

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

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

string myFormattedListofParameters = "";
foreach (var p in myDynamicParameters)
{
myFormattedListofParameters += p.Name + "=" + p.Value.ToString();
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*ron 10

尝试:

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

  • @Sam Saffron当我按照你的代码时,我收到以下异常:[NullReferenceException:对象引用未设置为对象的实例.] C:\ Dev\Dapper\Dapper \中的Dapper.DynamicParameters.Get(String name) SqlMapper.cs:2574 (7认同)
  • 我相信`Get <T>(字符串名称)`函数仅在`IDbDataParameter`实例附加到参数后才起作用.换句话说,在Execute或Query或其他一些此类函数中使用参数之前,无法获取值.如果在使用参数之前调用`Get <T>(string name)`,则会得到空引用异常. (6认同)
  • 我和Gary在这里遇到了同样的例外.对此有任何更新? (2认同)

小智 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();
    }
Run Code Online (Sandbox Code Playgroud)