2011-08-16 39 views
1

下面是代码:C# - 无法参数值从RuntimeMethodInfo转换为字符串

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中的代码,并且在尝试在该行执行代码时仅收到错误。

我的

未能参数值从RuntimeMethodInfo转换为字符串

,但没有命中进行谷歌搜索。所以,我搜索了

从RuntimeMethodInfo转换为字符串

,仍然没有运气。

为了帮助您理解代码好一点,声明

GetSqlCommand("ins_error_log", databaseConnection) 

基本熄灭,并承认在引号中的信息是存储过程,而不是一个查询字符串。

所有这些代码上面已经在整个应用程序(别人写的)使用,我所做的就是将它复制并进行必要的修改,以存储过程的名称,该SQL参数,并插入值。

我感谢你的帮助!

*注:我试过设置这个问题称为“RuntimeMethodInfo”的标签,但它不会让我,因为我有不到1500的声誉。也许别人可以为我做,或给我处理这个问题的权限。

回答

1

这是这一行:

target_site_msg.Value = _error.TargetSite; 

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

target_site_msg.Value = _error.TargetSite.Name; 
+0

甜,让我插入这个,我会让你知道。谢谢! – Invaderleige

+0

嗯,这并没有给我我想要的价值,但它确实阻止了错误。所以我会给你修补的功劳。我一直在玩代码,并决定如果传入的所有参数都是String数据类型(而不是传递Exception数据类型),以防止出现任何错误。不是我所希望的工作,但有时似乎你需要“胶带”这个问题。 – Invaderleige

+0

好吧,我不能告诉你在你的代码之后是什么,所以我只是选择了一些东西:)很高兴它指出你在正确的方向。 – geofftnz

1

说不上来,如果这是你的问题,但它不会帮助:

inner_exception_msg.Value = _error.InnerException; 

我想你想:

inner_exception_msg.Value = _error.InnerException.Message; 
+0

我会试试看,并让你知道。谢谢! – Invaderleige

+0

尽管这应该允许InnerException的String值通过,但我仍然不断收到InvalidCast错误。在我应用上面的更改之后有一个不同的,但仍然是错误。我甚至尝试过ToString(),但仍然没有解决。看来,我只需要将所有参数作为字符串数据类型传递,而不是传递给Exception数据类型。 – Invaderleige

0

尝试使用SqlCommand.Parameters.AddWithValue(),随着inner_exception_msg PARAM需要是一个字符串而不是一个对象。 InnerExceptionException对象,但你需要提供一个字符串。

也许.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); 
+0

请不要把这个错误的方式,但我很好奇,为什么我应该使用AddWithValue与我的方式?不会这样做只是你的方式有更少的代码行吗?再一次,只是好奇你为什么这么说。谢谢! – Invaderleige

+0

@入侵者没问题,没有冒犯!我的想法是,这11行代码比22行更具可读性和可维护性。它也表达了你的意图:用一个值设置一个参数。有一位开发人员在离开和离开之后维护这些代码;如果那是我,我会很高兴看到适量的代码。 –

+0

好点,我很高兴我没有跳过这个。我回去实施你的建议变化,并注意到一些创造我所有问题的东西。在我的所有“cmd.Parameters.Add”语句之前,我已经声明了“SqlParameter =”;你上面提出的代码没有。一旦我把它带走,没有更多的转换问题,因为它不再试图将值存储到SqlParameter数据类型。在我从所有代码中删除“SqlParameter =”后,我就可以使用.ToString()并且它成功运行了! – Invaderleige

相关问题