Я пытаюсь перехватить и зарегистрировать все команды SQL
в базе данных. И мне нужны параметры и их значения. Но command.Parameters
не имеет IEnumerable
. Я мог бы пойти за for-statement
, но любопытный чувствует себя как набор назад.Итерация через параметры в DbCommand
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
собственности Log
.
Этот код слегка скорректирован и взят из блога this.
Почему вы не используете в построенную функциональность журнала ФВ 6? Он будет предоставлять все SQL-выражения и их имена/значения параметров. http://msdn.microsoft.com/en-us/library/dn469464.aspx –
Rand, это именно то, что я использую, но ссылка, которую вы вставили, делает это с NLog сторонним lib. И ссылка, которую я вставил, не использует стороннюю библиотеку. Оба блога посвящены перехвату команд 'sql'. – Quoter