c# -将参数值从RuntimeMethodInfo转换为字符串失败

本文关键字:转换 字符串 失败 RuntimeMethodInfo 参数 | 更新日期: 2023-09-27 18:05:53

代码如下:

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,而不是在上面我赋值的点之一。我在调试中逐行执行代码,只有在尝试执行一行代码时才会出现错误。

我用Google搜索

将参数值从RuntimeMethodInfo转换为字符串失败

但没有命中。所以我搜索

从RuntimeMethodInfo转换为String

仍然没有运气。

为了帮助您更好地理解代码,语句

GetSqlCommand("ins_error_log", databaseConnection)

基本上识别出引号中的信息是存储过程,而不是查询字符串。

上面的所有代码都在整个应用程序中使用(由其他人编写),我所做的只是复制它,并对存储过程名称、SQL参数和插入的值进行必要的修改。

我非常感谢你的帮助!

*注:我尝试设置TAG为这个问题为"RuntimeMethodInfo",但它不会让我,因为我有少于1500的声誉。也许其他人可以帮我做,或者给我权限来处理这件事。

c# -将参数值从RuntimeMethodInfo转换为字符串失败

是这一行:

target_site_msg.Value = _error.TargetSite;

Exception.TargetSite是一个MethodBase,而不是字符串。试着改成:

target_site_msg.Value = _error.TargetSite.Name;

不知道这是不是你的问题,但这不会有帮助:

inner_exception_msg.Value = _error.InnerException;

我想你要:

inner_exception_msg.Value = _error.InnerException.Message;

尝试使用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);