我正在尝试拦截并将所有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博客。
答案 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());