【问题标题】:Elmah - Logging sql in the database to review in elmah.axdElmah - 在数据库中记录 sql 以在 elmah.axd 中查看
【发布时间】:2014-01-17 17:30:59
【问题描述】:

我有一个经常执行查询以从本地数据库获取数据的 .NET Web 应用程序。

在查询未运行(由于异常)或查询返回意外数据集(例如空集)的情况下。我希望能够重建查询(用实际使用的值替换它的@parameters)并将完整的查询与异常一起存储在数据库中。

我知道我可以通过标准代码执行此操作,但我想知道通过 Elmah 执行此操作是否更安全?

还可以通过 Elmah 执行此操作,让我能够通过 elmah.axd 查看已执行的 sql(启用访问时)?

【问题讨论】:

    标签: sql .net vb.net web-applications elmah


    【解决方案1】:

    除非抛出的异常包含带有实际值的查询,否则 ELMAH 除了记录异常之外并不能帮助您。您可以自己捕获异常并使用 ErrorSignal.Raise 方法对 ELMAH 进行自定义日志记录,如下所述:How to use ELMAH to manually log errors?

    【讨论】:

      【解决方案2】:

      我通过将异常和实际命令传递给新的异常类来记录 SQL 异常。该类包装了 SqlException 和 System.Data.Common.DbCommand 对象。使用该信息,我可以创建一条消息来提供 sql 命令详细信息:

       public override string Message
          {
              get
              {
                  StringBuilder message = new StringBuilder("");
                  StringBuilder sql = new StringBuilder("");
                  sql.AppendFormat(" {0} ", Command.CommandText);
                  foreach (SqlParameter param in Command.Parameters)
                  {
                    sql.AppendFormat(" {0} - {1}", param.ParameterName,
                                       param.Value.ToString());
                  }
                  message.AppendFormat("Error: {0} SQL: {1}  User: {2}", SqlEx.Message, 
                                        sql, Username);
                  return message.ToString();
              }
      
          }
      

      最后,我使用 ErrorSignal Raise 方法在 Elmah 中记录消息:

      Elmah.ErrorSignal.FromCurrentContext().Raise(new DetailSqlException(e.Exception as SqlException, e.Command, user));
      

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 2011-10-05
        • 2015-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 2012-05-27
        • 1970-01-01
        相关资源
        最近更新 更多