2014-05-02 3 views
1

Я пытаюсь перехватить и зарегистрировать все команды 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.

+0

Почему вы не используете в построенную функциональность журнала ФВ 6? Он будет предоставлять все SQL-выражения и их имена/значения параметров. http://msdn.microsoft.com/en-us/library/dn469464.aspx –

+0

Rand, это именно то, что я использую, но ссылка, которую вы вставили, делает это с NLog сторонним lib. И ссылка, которую я вставил, не использует стороннюю библиотеку. Оба блога посвящены перехвату команд 'sql'. – Quoter

ответ

4

Вы можете сделать это список ...

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()); 
+0

Спасибо, очень аккуратный. Полностью упускается из вида 'Cast()'. – Quoter

Смежные вопросы