迭代DbCommand中的参数

时间:2014-05-02 23:04:14

标签: c# entity-framework logging interceptor sqlcommand

我正在尝试拦截并将所有SQL命令记录到数据库中。我也需要参数及其值。但是command.Parameters没有IEnumerable。我可以选择for-statement,但有点感觉像是退缩。

public override void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
    _stopwatch.Stop();
    if (interceptionContext.Exception != null)
    {
        _logger.Error(interceptionContext.Exception, "Error executing command: {0}", command.CommandText);

        string param = string.Empty;

        if (command.Parameters.Count > 0)
        {
            foreach (var t in command.Parameters)
            {
                param += t....
            }
        }

        Log log = new Log() 
        { 
            Date = DateTime.UtcNow, 
            LogLevel = LogLevel.Error, 
            Message = command.CommandText + "\r\n " + param. 
        };
    }
    else
        _logger.TraceApi("SQL Database", "CommandInterceptor.ScalarExecuted", _stopwatch.Elapsed, "Command: {0}: ", command.CommandText);

    base.ScalarExecuted(command, interceptionContext);
}

我需要构建一个string(我知道我应该使用StringBuilder代替string param,但问题是为了保持简单)以便我可以将其传递给Message的{​​{1}}属性。

此代码略有调整,取自this博客。

1 个答案:

答案 0 :(得分:5)

你可以把它变成一个列表......

StringBuilder sb = new StringBuilder();

command.Parameters.Cast<DbParameter>()
                  .ToList()
                  .ForEach(p => sb.Append(
                                   string.Format("{0} = {1}{2}",
                                      p.ParameterName,
                                      p.Value,
                                      Environment.NewLine)));

Console.WriteLine(sb.ToString());