代码之家  ›  专栏  ›  技术社区  ›  Kyle Vassella

.NET-使用多个SqlParameters记录数据库异常并指定每个数据库列中的内容

  •  1
  • Kyle Vassella  · 技术社区  · 6 年前

    我在跟踪 KudVenkat 在中记录数据库异常的教程 .NET 以下内容: http://csharp-video-tutorials.blogspot.com/2012/12/logging-exception-to-database-part-75.html

    他的方法很适合将一个东西(包含异常消息、异常类型、堆栈跟踪等的异常消息字符串)存储到一个列中- @exceptionMessage 列。

    我正试图将这个完整的异常消息分成几个部分,例如exceptionType(到@exceptionType列)、exceptionMessage(到@exceptionMessage列)、stackTrace(到@stackTrace列)等。

    到目前为止,我可以多次通过 SqlParameters 使用:

            List<SqlParameter> sp = new List<SqlParameter>() {
                new SqlParameter("@exceptionType", log) { },
                new SqlParameter("@exceptionMessage", log) { }
    
            };
    
            cmd.Parameters.AddRange(sp.ToArray());
    

    但我似乎无法将这些数据拆分成我想要的列-按照我的方式,我必须为每个sqlparameters调用logger函数 (请参阅下面的代码注释) ,它们各自创建一个新行,每个列上都有相同的消息。而不是 Type 输入列并 Message 转到消息列,它创建一行 消息 插入到类型列和消息列中,然后插入另一行 类型 插入到类型列和消息列中。

    我认为这与我的logtodb类的性质有关:

    public class storedProcedure : ApiController
    {
        public static void Log(Exception exception)
        {
    
            // exception type
            StringBuilder sbExceptionType = new StringBuilder();
    
            // exception message
            StringBuilder sbExceptionMessage = new StringBuilder();
    
            do
            {
                // exception type
                sbExceptionType.Append("Exception Type" + Environment.NewLine);
                sbExceptionType.Append(exception.GetType().Name);
                sbExceptionType.Append(Environment.NewLine + Environment.NewLine);
    
                // exception message
                sbExceptionMessage.Append("Message" + Environment.NewLine);
                sbExceptionMessage.Append(exception.Message + Environment.NewLine + Environment.NewLine);
                sbExceptionMessage.Append("Stack Trace" + Environment.NewLine);
                sbExceptionMessage.Append(exception.StackTrace + Environment.NewLine + Environment.NewLine);
    
                exception = exception.InnerException;
            }
            while (exception != null);
    
    ////Calling this twice is a problem. How can I rebuild this to log both into the appropriate column?////
            LogToDB(sbExceptionMessage.ToString());
            LogToDB(sbExceptionType.ToString());
        }
    
        private static void LogToDB(string log)
        {
    
            string connectionString = ConfigurationManager.ConnectionStrings["redacted"].ConnectionString;
    
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                SqlCommand cmd = new SqlCommand("redacted", con);
    
                cmd.CommandType = CommandType.StoredProcedure;
    
                List<SqlParameter> sp = new List<SqlParameter>() {
                    new SqlParameter("@exceptionType", log) { },
                    new SqlParameter("@exceptionMessage", log) { }
    
                };
    
                cmd.Parameters.AddRange(sp.ToArray());
    
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   tchelidze    6 年前

    打电话 LogToDb 两次将导致在数据库中插入两行。

    经过 log 作为 @exceptionType @exceptionMessage 参数值导致插入相同的值 Type Message 柱。

    修改 LogToDB 作为

    private static void LogToDB(string exceptionType, string exceptionMessage)
    {
       ....
       List<SqlParameter> sp = new List<SqlParameter>() {
                new SqlParameter("@exceptionType", exceptionType) { },
                new SqlParameter("@exceptionMessage", exceptionMessage) { }
    
            };
       ...
    
     }
    

    并调用 洛格托德 只有 一旦 (而不是现在的两倍)

    LogToDB(sbExceptionType.ToString(), sbExceptionMessage.ToString());