System.InvalidCastException在服务器上

时间:2014-12-29 17:20:45

标签: c# c#-4.0

您好,我遇到问题我无法找到解决方案,在我的笔记本电脑中一切正常,但在服务器上它给了我这个错误:"

错误讯息:

  

System.InvalidCastException:指定的强制转换无效。在   System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value)at   System.Data.DataRowExtensions.Field [T](DataRow row,String columnName)   在Blue.Adesao.GetAdesoes(SqlConnection conexao,SqlTransaction trans)   在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 id=@IDValido";
        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。

2 个答案:

答案 0 :(得分: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"));
}

答案 1 :(得分:2)

一个体面的反汇编程序是找出代码失败原因的好方法。我说:

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

只留下一种可能性,您查询的表中的列包含null。表格设计的屏幕截图不排除这种可能性,您允许“valido”为空。异常消息应该告诉你这个,确保你能看到它。