【问题标题】:Why is an exception message only a SQL Server column name?为什么异常消息只是 SQL Server 列名?
【发布时间】:2013-07-08 15:42:59
【问题描述】:

我们有将异常记录到我们的数据库中的错误处理。一个错误正在记录,它只是一个 SQL Server 列名,仅此而已。我们记录的错误是与内部异常连接的异常消息。所以我们希望看到这种异常和更多细节,但我们看到的只是ProblemField

我们在 .Net 2.0 框架上使用 C# 编写代码,并使用 SQL Server 2005 作为数据库。

这是代码,以及我注意到的问题。

using (SqlCommand cmd = new SqlCommand("MyStoredProcedure", connection))
{
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("@PARAM1", var1);
   cmd.Parameters.AddWithValue("@PARAM2", var2);
   cmd.Parameters.AddWithValue("@PARAM3", var3);

   using (SqlDataReader rdr = cmd.ExecuteReader())
   {
       if (rdr.HasRows)
       {
           rdr.Read();

           var4 = (double)rdr["ProblemField"];
           var5 = (double)rdr["OtherField"];
       }
       else
       {
           var4 = var5 = 0.0;
       }
   }
}

我将rdr["ProblemField"]rdr["OtherField"] 的这些读取改为使用Double.TryParse

选择MyStoredProcedure

SELECT TOP 1 [anbrID]
        ,[col1]
        ,[col2]
        ,[col3]
        ,COALESCE([ProblemField], 0.0)
        ,COALESCE([OtherField], 0.0)
        ,[col6]
        FROM MyTable
        WHERE (col1=@PARAM1 OR
            CAST(@PARAM2 AS int) between CAST(col2 AS int) and CAST(col3 AS int)) AND
            col6 =@PARAM3
        ORDER BY id DESC

我已将这些 COALESCEs 更改为也有一个 as “ProblemField”等。

底线:这种异常信息正常吗?对于这样一个模糊的错误,我的修复是否合理?

【问题讨论】:

  • 您没有显示记录异常的位置。可能您刚刚记录了字段名称。显示记录异常的行
  • 我们使用的异常日志记录在我们所有的项目中都是相同的,这是我们唯一一次看到这个我记得。它接受一个异常对象并使用 exception.Message + " - " + excption.InnerException
  • 您可能应该单步执行这段代码,看看实际发生了什么。我猜没有找到列名或其他。
  • 您可能还需要查看您的异常的.InnerException!这些通常包含非常有价值的附加信息! (并且可以嵌套多层)
  • 您应该至少记录外部异常的类型,最好记录 exception.ToString(),其中包括任何内部异常、堆栈跟踪和其他有用的数据。我怀疑外部异常是您自己生成的用于包装内部 SqlException 的异常。

标签: c# sql-server-2005 exception stored-procedures .net-2.0


【解决方案1】:

这就是为什么(以及其他原因)您应该记录整个异常(使用 .ToString)以便获得堆栈跟踪和异常类型。

不过,我会冒险猜测,这是 SqlDataReader 抛出的 ArgumentOutOfRangeException - 我相信它只给出了 field 参数而没有任何其他消息。您目前没有合并列的“as”,这肯定会导致这种情况。你说你添加了它,但我怀疑它不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多