Я следую руководству KudVenkat
по регистрации исключений в базе данных в .NET
: http://csharp-video-tutorials.blogspot.com/2012/12/logging-exception-to-database-part-75.html
Его способ хорош для хранения одной вещи — строки ExceptionMessage, содержащей сообщение об исключении, тип исключения, трассировку стека и т. д. — в один столбец — столбец @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 (см. комментарии к коду ниже), и каждый из них создает новую строку с одним и тем же сообщением в каждом столбце. Вместо того, чтобы Type
переходить в столбец «Тип», а Message
— в столбец «Сообщение», он создает одну строку с Message
, вставленную в столбцы «Тип» и «Сообщение», а затем еще одну строку с Type
, вставленную в столбцы «Тип» и «Сообщение».
Я считаю, что это связано с природой моего класса 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