【问题标题】:What datatype is the Exception variable?异常变量是什么数据类型?
【发布时间】:2014-12-22 08:46:30
【问题描述】:

我有一个代码正在运行,我需要使用以下代码将异常保存到 SQL Server 数据库中:

    public void AcieveSomething()
    {
       //Datatype Declarations 
        string ApplicationName = "App_Name";
        string ClassName = "Class_Name";
        string MethodName = "Achieve Something";

       try
       {
         //Main part of the code
       }

       catch(Exception ex)
       {
         //Calling function to input the error into DB
          ErrorLog.WriteErrorLog(ex, ApplicationName, ClassName, MethodName);
       }
   }

如果我要将ex 值放入数据库,SQL Server 数据库中Exception ex; 的数据类型是什么?

【问题讨论】:

  • 主要应该得到消息,innerException和stackTrace
  • 1) SSMS 不是数据库;它是连接到 SQL Server 数据库的工具 2) 对于每种 .NET 类型,没有直接的 SQL 等效项。相反,您应该将异常分解为相关部分,例如异常类型(ex.GetType().Name)、消息(ex.Message)等名称。
  • 您可以使用异常消息存储在数据库中。通过使用消息方法。(ex.Message 或 ex.InnerException)
  • @Sarbanjeet 如果要存储Exception,则应始终使用ex.ToString() 来捕获异常消息和堆栈跟踪,并对可能遇到的任何内部异常执行相同的操作。一直走下去,直到您检索到所有内部异常,并将它们作为字符串存储在您的数据库中。
  • @SandySands 是的,它应该存储为字符串。我同意你的观点。

标签: c# sql-server exception


【解决方案1】:

正如@Liath 所说,Exception 继承自System.Object。从数据库返回的任何错误或警告通常都是SqlException 类型。

理想的做法是将Exception 对象序列化为 XML 并将其作为 XML 存储在数据库中。

为此,最好创建您自己的 Exception 类型来封装您要存储的信息,如下所示:

[Serializable]
public class StorableException
{
    public DateTime TimeStamp { get; set; }
    public string Message { get; set; }
    public string StackTrace { get; set; }

    public StorableException()
    {
        this.TimeStamp = DateTime.Now;
    }

    public StorableException(string Message) : this()
    {
        this.Message = Message;
    }

    public StorableException(System.Exception ex) : this(ex.Message)
    {
        this.StackTrace = ex.StackTrace;
    }

    public override string ToString()
    {
        return this.Message + this.StackTrace;
    }
}

那么你可以这样做:

catch(Exception ex)
{
    StorableException s = new StorableException(ex);

    //now we can serialize it
    XmlSerializer xsSubmit = new XmlSerializer(typeof(StorableException));
    StringWriter sww = new StringWriter();
    XmlWriter writer = XmlWriter.Create(sww);
    xsSubmit.Serialize(writer, s);
    var xml = sww.ToString();

    //now save the xml file to a column in your database

    ErrorLog.WriteErrorLog(ex, ApplicationName, ClassName, MethodName);
}

【讨论】:

  • 我不知道为什么投反对票!?这是一个很好的建议,它捕获了所有属性,处理内部异常,并且作为 Exception 类是可序列化的。
  • @Liath 不知道否决票大声笑,也许是格林奇 :)
  • 问题是什么数据类型是异常。不是如何保存在数据库中。但是,您正确地建议了更好的方法来完成其任务。虽然不是我的反对票。如果您只是添加一些代码示例和解释为什么他/她应该使用字符串。
  • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • @VsevolodGoloviznin 我添加的代码包括将异常序列化为 XML 并将所需信息封装到新异常中
【解决方案2】:

Exception 是一个继承自System.Object 的类,如果要将其持久化到数据库中,则需要确定要存储哪些属性并将它们添加到不同的列(或使用序列化方法other answer)。

通常开发人员使用的属性是 Message、StackTrace 和 InnerException,尽管从 Exception 派生的其他类型可能还有其他类型。

Message 和 StackTrace 都是字符串,因此 nvarchar(或其他文本字段)适合存储它们。由于 InnerException 是另一个异常(并且可能有它自己的内部异常),因此最好的方法是将 InnerException 作为它自己的行添加到您的异常表中。

【讨论】:

  • 如果需要将 ex.Message 或 ex.InnerException 放入我的数据库中的表中,那么我必须在 SQL 中使用的数据类型是什么?
  • @SandySands 查看编辑,消息是字符串,因此 nvarchar(x) 或任何其他用于处理文本的数据类型
  • 谢谢。这很有帮助
  • @SandySands 没问题 - 如果这回答了您的问题,请使用大勾号将其标记为已接受。
【解决方案3】:

当将异常作为 XML 序列化到数据库中时,查询回来很痛苦。将 Exception.InnerException 写入 nvarchar(max) 更方便。

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2016-09-15
    相关资源
    最近更新 更多