.NET - บันทึกข้อยกเว้นไปยัง db โดยใช้ SqlParameters หลายตัวและระบุสิ่งที่จะเกิดขึ้นในแต่ละคอลัมน์ db

ฉันกำลังติดตามบทช่วยสอนของ KudVenkat สำหรับการบันทึกข้อยกเว้นไปยังฐานข้อมูลใน .NET: http://csharp-video-tutorials.blogspot.com/2012/12/logging-Exception-to-database-part-75html

วิธีของเขาดีสำหรับการจัดเก็บสิ่งหนึ่ง - สตริง ExceptionMessage ที่มีข้อความข้อยกเว้น, ประเภทข้อยกเว้น, ติดตามสแต็ก ฯลฯ - ไว้ในคอลัมน์เดียว - คอลัมน์ @exceptionMessage

ฉันกำลังพยายามแยกข้อความข้อยกเว้นแบบเต็มออกเป็นส่วนต่างๆ เช่น ExceptionType (ไปยังคอลัมน์ @ExceptionType), ข้อยกเว้นข้อความ (ไปยังคอลัมน์ @ExceptionMessage), StackTrace (ไปยังคอลัมน์ @stackTrace) ฯลฯ

จนถึงตอนนี้ ฉันสามารถส่งผ่าน SqlParameters หลายรายการได้โดยใช้:

        List<SqlParameter> sp = new List<SqlParameter>() {
            new SqlParameter("@exceptionType", log) { },
            new SqlParameter("@exceptionMessage", log) { }

        };

        cmd.Parameters.AddRange(sp.ToArray());

แต่ดูเหมือนว่าฉันไม่สามารถแยกข้อมูลนี้ออกเป็นคอลัมน์ที่ฉันต้องการได้ - วิธีที่ฉันทำ ฉันต้องเรียกใช้ฟังก์ชันตัวบันทึกสำหรับ SqlParameters แต่ละตัวของฉัน (ดูความคิดเห็นโค้ดของฉันด้านล่าง) และแต่ละคนจะสร้างแถวใหม่โดยมีข้อความเดียวกันในทุกคอลัมน์ แทนที่จะ Type ไปที่คอลัมน์ Type และ Message ไปที่คอลัมน์ Message ระบบจะสร้างแถวหนึ่งแถวโดยแทรก Message ลงในคอลัมน์ Type และ Message จากนั้นอีกแถวหนึ่งโดยแทรก Type ลงในคอลัมน์ 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();
        }
    }
}

person Kyle Vassella    schedule 16.07.2018    source แหล่งที่มา
comment
ใช่ คุณกำลังส่งค่าเดียวกันไปยังพารามิเตอร์ทั้งสอง log - เปลี่ยน LogToDB(string log) เป็น LogToDB(string exceptionMessage, string exceptionType) และส่งค่าตามนั้น...   -  person mjw    schedule 17.07.2018
comment
คุณพูดถูก - ขอบคุณมาก!   -  person Kyle Vassella    schedule 17.07.2018


คำตอบ (1)


การเรียก LogToDb สองครั้งทำให้เกิดการแทรก 2 แถวในฐานข้อมูล

การส่งค่าพารามิเตอร์ 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 เพียง หนึ่งครั้ง (แทนที่จะเป็นสองครั้งเหมือนตอนนี้)

LogToDB(sbExceptionType.ToString(), sbExceptionMessage.ToString());
person tchelidze    schedule 16.07.2018
comment
ฉันไม่เคยได้รับการตอบกลับที่เร็วกว่านี้หรือมีวิธีแก้ไขที่ตรงไปกว่านี้อีกแล้ว ขอบคุณมาก วิธีนี้ได้ผล ดีใจที่การแก้ไขค่อนข้างง่าย - person Kyle Vassella; 17.07.2018