Especified cast无效

时间:2017-08-28 17:57:29

标签: c# sql

我不明白为什么我收到这个错误,我有一个列数据表: 整数numeromesa,字符串状态和整数valortotal。

当我尝试将带有select查询的数据导入到我的Pedido变量时,它会让我得到强制转换错误。   这是将从表

接收数据的类
public class Pedido
{
    public int numeromesa { get; set; }
    public int valorpedido { get; set; }
    public string status { get; set; }

}

现在这是我使用选择查询

的方法
    public List<Pedido> listaPedido()
    {
        vsql = "SELECT * FROM pedidos";
        List<Pedido> bancoPedidos = new List<Pedido>();
        NpgsqlCommand objcmd = null;
         objcmd = new NpgsqlCommand(vsql, con);
                NpgsqlDataAdapter adp = new NpgsqlDataAdapter(objcmd);
                DataTable dt = new DataTable();
                adp.Fill(dt);
                foreach (DataRow row in dt.Rows)
                {
                 //This is line 185
                    Pedido p = new Pedido
                    {
                        numeromesa = (int)row[1],
                        status = (string)row[2],
                        valorpedido = (int)row[3]                            
                    };
                   bancoPedidos.Add(p);

                    return bancoPedidos;
         }

问题似乎是valorpedido变量,如果我把它拿出来,代码工作正常

**************例外文字************** System.InvalidCastException:指定的强制转换无效。    PostgreSQL.cs:第185行

2 个答案:

答案 0 :(得分:2)

原始代码按索引寻址列。索引从零开始,随着架构的变化,它们容易出现错位 而是使用名称来访问列:

var p = new Pedido
{
    numeromesa = (int)row["numeromesa"],
    status = row["status"].ToString(),
    valorpedido = (int)row["valortotal"]
};

此代码假定statusvalortotal都不可为空。如果是,您需要考虑到这一点,例如:

public class Pedido
{
    public int numeromesa { get; set; }
    public int? valorpedido { get; set; }
    public string status { get; set; }
}

var p = new Pedido
{
    numeromesa = (int)row["numeromesa"],
    status = row["status"].ToString()
};

if(row["valortotal"].Equals(DBNull.Value))
{
    p.valorpedido = null;
}
else
{
    p.valorpedido = Convert.ToInt32(row["valortotal"]);
}

在此上下文中,按名称而不是序数查找值的性能损失可以忽略不计(除非我们正在讨论成千上万条记录),并为您提供一个重要优势:如果列的顺序由于pedidos表或视图架构的修改而改变,您的代码将继续有效。正如它最初编写的那样,它会破裂。

答案 1 :(得分:0)

由于错误已开启:

 valorpedido = (int)row[3]   

问题是当行[3]从数据库出来时,它不是整数类型。

很有可能你被一列拒绝,因为它是一个基于零的索引与数据行。