我不明白为什么我收到这个错误,我有一个列数据表: 整数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行
答案 0 :(得分:2)
原始代码按索引寻址列。索引从零开始,随着架构的变化,它们容易出现错位 而是使用名称来访问列:
var p = new Pedido
{
numeromesa = (int)row["numeromesa"],
status = row["status"].ToString(),
valorpedido = (int)row["valortotal"]
};
此代码假定status
和valortotal
都不可为空。如果是,您需要考虑到这一点,例如:
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]从数据库出来时,它不是整数类型。
很有可能你被一列拒绝,因为它是一个基于零的索引与数据行。