ฉันกำลังติดตามบทช่วยสอนของ 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();
}
}
}
log
- เปลี่ยนLogToDB(string log)
เป็นLogToDB(string exceptionMessage, string exceptionType)
และส่งค่าตามนั้น... - person mjw   schedule 17.07.2018