C # - не удалось преобразовать значение параметра из RuntimeMethodInfo в строку - PullRequest
1 голос
/ 17 августа 2011

Вот код:

internal static void UpdateErrorLogTable(string type, string location, string method, Exception _error, string ftpDirectory, string remoteName, string localName)
    {
        try
        {
            using (SqlConnection databaseConnection = GetDatabaseConnection())
            {
                using (SqlCommand cmd = GetSqlCommand("ins_error_log", databaseConnection))
                {
                    SqlParameter log_date = cmd.Parameters.Add("@log_date", SqlDbType.DateTime);
                    SqlParameter exception_type = cmd.Parameters.Add("@exception_type", SqlDbType.VarChar);
                    SqlParameter class_name = cmd.Parameters.Add("@class_name", SqlDbType.VarChar);
                    SqlParameter method_name = cmd.Parameters.Add("@method_name", SqlDbType.VarChar);
                    SqlParameter error_msg = cmd.Parameters.Add("@error_msg", SqlDbType.VarChar);
                    SqlParameter stack_trace_msg = cmd.Parameters.Add("@stack_trace_msg", SqlDbType.VarChar);
                    SqlParameter target_site_msg = cmd.Parameters.Add("@target_site_msg", SqlDbType.VarChar);
                    SqlParameter ftp_directory = cmd.Parameters.Add("@ftp_directory", SqlDbType.VarChar);
                    SqlParameter ftp_name = cmd.Parameters.Add("@ftp_name", SqlDbType.VarChar);
                    SqlParameter ftp_path = cmd.Parameters.Add("@ftp_path", SqlDbType.VarChar);
                    SqlParameter inner_exception_msg = cmd.Parameters.Add("@inner_exception_msg", SqlDbType.VarChar);

                    log_date.Value = m_todaysDate;
                    exception_type.Value = type;
                    class_name.Value = location;
                    method_name.Value = method;
                    error_msg.Value = _error.Message;
                    stack_trace_msg.Value = _error.StackTrace;
                    target_site_msg.Value = _error.TargetSite;
                    ftp_directory.Value = ftp_directory;
                    ftp_name.Value = remoteName;
                    ftp_path.Value = localName;
                    inner_exception_msg.Value = _error.InnerException;

                    cmd.ExecuteNonQuery();
                }
            }  // using databaseConnection
        } //end of TRY statement
        catch (SqlException e)
        {
            logFile.SendToLog("SqlException", "Logs\\LogsDataAccess.cs", "UpdateErrorLogTable()", e);
        } //end of SqlException CATCH statement
    } //end of method UpdateErrorLogTable

Я получаю ошибку InvalidCastException, но это происходит при попытке выполнить

cmd.ExecuteNonQuery();

Часть, которую я не могу понять, это то, почему я получаю InvalidCastException здесь, а не в одной из точек выше, где я присваиваю значения. Я пошагово прошёл код в Debug построчно, и он получает ошибку только при попытке выполнить код в этой строке.

Я выполнил поиск Google для

Не удалось преобразовать значение параметра из RuntimeMethodInfo в строку

но без попаданий. Поэтому я искал

преобразовать из RuntimeMethodInfo в строку

и до сих пор не повезло.

Чтобы помочь вам понять код немного лучше, утверждение

GetSqlCommand("ins_error_log", databaseConnection)

в основном выходит и распознает информацию в кавычках как хранимую процедуру, а не строку запроса.

Весь этот код выше использовался во всем приложении (написанном кем-то другим), и все, что я сделал, это скопировал его и внес необходимые изменения в имя хранимой процедуры, параметры SQL и вставленные значения.

Я ценю вашу помощь!

* Примечание: я попытался установить TAG для этого вопроса как "RuntimeMethodInfo", но он не позволил мне, потому что у меня менее 1500 репутации. Может быть, кто-то другой может сделать это для меня или дать мне разрешение на это.

Ответы [ 3 ]

1 голос
/ 17 августа 2011

Вот эта строка:

target_site_msg.Value = _error.TargetSite;

Exception.TargetSite - это MethodBase, а не строка.Попробуйте изменить на:

target_site_msg.Value = _error.TargetSite.Name;
1 голос
/ 17 августа 2011

Не знаю, если это ваша проблема, но это не поможет:

inner_exception_msg.Value = _error.InnerException;

Я думаю, вы хотите:

inner_exception_msg.Value = _error.InnerException.Message;
0 голосов
/ 17 августа 2011

Попробуйте использовать SqlCommand.Parameters.AddWithValue() вместе с параметром inner_exception_msg, который должен быть строкой, а не объектом. InnerException - это объект Exception, но вам нужно указать строку.

Возможно, .Message достаточно хорошо.

cmd.Parameters.AddWithValue("@log_date", m_todaysDate);
cmd.Parameters.AddWithValue("@exception_type", type);
cmd.Parameters.AddWithValue("@class_name", location);
cmd.Parameters.AddWithValue("@method_name", method);
cmd.Parameters.AddWithValue("@error_msg", _error.Message);
cmd.Parameters.AddWithValue("@stack_trace_msg", _error.StackTrace);
cmd.Parameters.AddWithValue("@target_site_msg", _error.TargetSite);
cmd.Parameters.AddWithValue("@ftp_directory", ftp_directory);
cmd.Parameters.AddWithValue("@ftp_name", remoteName);
cmd.Parameters.AddWithValue("@ftp_path", localName);
cmd.Parameters.AddWithValue("@inner_exception_msg", _error.InnerException.Message);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...