.NET - регистрируйте исключения в базе данных с использованием нескольких параметров SqlParameters и указывайте, что происходит в каждом столбце базы данных.

Я следую руководству 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();
        }
    }
}

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