2014-12-29 32 views
2

你好我有一个问题,我无法找到一个解决办法,在我的笔记本电脑一切正常,但是在服务器上它给我这个错误:“System.InvalidCastException在服务器

错误消息:

System.InvalidCastException: Specified cast is not valid. at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) at Blue.Adesao.GetAdesoes(SqlConnection conexao, SqlTransaction trans) at listagem_form_obras.GetAdesoes()"

大约功能:

public static DataTable GetAdesoes (SqlConnection conexao, SqlTransaction trans) { 
     SqlCommand comando; 
     String sql; 

     sql = "SELECT id, data_criacao, nome, nif, telefone, email, valido " + 
       "FROM forms_adesao_entidade "; 
     comando = new SqlCommand(sql, conexao, trans); 
     SqlDataAdapter dtadapter = new SqlDataAdapter(comando); 
     DataTable dt = new DataTable(); 
     dtadapter.Fill(dt); 

     dt.Columns.Add("dataFormatada", System.Type.GetType("System.String")); 
     dt.Columns.Add(new DataColumn("validacao", System.Type.GetType("System.String"))); 
     foreach(DataRow r in dt.Rows) { 
      int valido = (int)r.Field<int>("valido"); 
      r["validacao"] = Adesao.GetValidacao(valido, conexao); 
      r["dataFormatada"] = Utilidades.FormatarData(r.Field<DateTime>("data_criacao")); 
     } 
     return dt; 
    } 

    public static string GetValidacao (int IDValido, SqlConnection conexao) { 
     string sql = ""; 
     DataTable dt = new DataTable(); 
     sql = "SELECT [designacao] FROM [forms_estados] WHERE [email protected]"; 
     SqlCommand comando = new SqlCommand(sql, conexao); 
     comando.Parameters.Add(new SqlParameter("@IDValido", SqlDbType.Int)); 
     comando.Parameters["@IDValido"].Value = IDValido; 
     SqlDataAdapter dtadapter = new SqlDataAdapter(comando); 
     dtadapter.Fill(dt); 

     return dt.Rows[0].Field<string>("designacao"); 
    } 

数据库Database

在前端我有一个简单的gridview。

+0

对于有问题的行,“data_criacao”为空吗? –

+0

您的某些服务器数据可能为空。你有两个不同的数据库吗?所有允许空值的列在投射前都必须检查是否包含值。 – t3chb0t

+0

默认情况下,每个被调用的字段都有一个值,无论是在数据库还是在插入查询中,以防万一出现问题 – Nikato

回答

4

int valido = (int)r.Field<int>("valido");是造成错误,对不对?

您的数据库允许该字段为空。所以这可能是问题。当你遇到一个具有null-valido的记录时,投射是不可能的。

你可以尝试像以下:

foreach(DataRow r in dt.Rows) 
{ 
    int valido = r.IsNull("valido") ? 0 : r.Field<int>("valido"); 
    r["validacao"] = Adesao.GetValidacao(valido, conexao); 
    r["dataFormatada"] = Utilidades.FormatarData(r.Field<DateTime>("data_criacao")); 
} 
+0

可能是这个问题,好赶上;) – mybirthname

+1

我敢打赌,这是问题; - ]和优胜者是@khlr – t3chb0t

+0

,但是用这一行我怎样在下一个方法中调用var valido?因为它显示我一个错误的无效论据 – Nikato

2

一个体面的反汇编是找出为什么代码失败的好办法。矿山说:

private static T ValueField(object value) 
{ 
    if (DBNull.Value == value) 
    { 
     throw DataSetUtil.InvalidCast(Strings.DataSetLinq_NonNullableCast(typeof(T).ToString())); 
    } 
    return (T) value; 
} 

剩下只有一种可能,在你查询表中的列包含空。你的表设计截图并不排除这种可能性,你允许“valido”为null。例外消息应该告诉你这一点,确保你能看到它。

+0

这是调试问题最有洞察力的方式,因为这将形成数据有什么问题的基础。 DB本身做了一些理智的检查,因为它不允许Int字段中的非int数据,所以唯一可以逃避检查的是NULL,肯定是允许的 –