2014-05-02 65 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(我知道我應該在string代替使用StringBuilderparam,但對這個問題的緣故,要保持它的簡單),這樣我可以把它傳遞給的Message財產Log

此代碼稍作調整,取自this博客。

+0

你爲什麼不使用EF 6的內置日誌功能?它將傳遞所有SQL語句及其參數名稱/值。 http://msdn.microsoft.com/en-us/library/dn469464.aspx –

+0

蘭德,這正是我正在使用的,但你粘貼的鏈接使用NLog的第三方庫。我粘貼的鏈接不使用第三方庫。這兩個博客都是關於攔截'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