我有一个计算项目成本的方法,但是需要对我的数据库中的每一行执行计算,一旦计算完成,我想将它存储在列表中但是我收到错误。
到目前为止,我有:string Query = "SELECT p.PID, p.PName, (p.Weight * b.Foodcost) + p.VetBill
+ b.Housing AS TotalCost FROM pet p INNER JOIN breed b ON
p.BreedID = b.BreedID";
OleDbCommand myCommand = new OleDbCommand(myQuery, con);
List<int> val = new List<int>();
try
{
con.Open();
OleDbDataReader reader = myCommand.ExecuteReader();
while (reader.Read())
{
val.Add(reader.GetInt32(0));
}
}
catch (Exception ex)
{
Console.Write("Error " + ex);
}
return val;
然而,当我运行它时,所有返回的是它完成计算的行的主键..我如何解决这个问题?我知道这个语句是正确的,因为当我在SQL或Access中运行语句时,它会给我预期的结果。
答案 0 :(得分:3)
你得错了列
string Query = "SELECT p.PID, p.PName, (p.Weight * b.Foodcost) + p.VetBill + b.Housing AS TotalCost FROM pet p INNER JOIN breed b ON p.BreedID = b.BreedID";
OleDbCommand myCommand = new OleDbCommand(myQuery, con);
List<int> val = new List<int>();
try
{
con.Open();
OleDbDataReader reader = myCommand.ExecuteReader();
while (reader.Read())
{
val.Add(reader.GetInt32(2));
}
}
catch (Exception ex)
{
Console.Write("Error " + ex);
}
return val;
试试这个
答案 1 :(得分:3)
改变这个......
val.Add(reader.GetInt32(0));
为...
val.Add(reader.GetInt32(2));
值为ordinal
位置,0
是第一个。
另外,也许可以考虑一下......
if (!reader.IsDBNull(2))
val.Add(reader.GetInt32(2));//or use reader.GetDouble(2) since its a cost?
else
val.Add(0);
我已添加GetDouble()
以防您返回Double,或者如果使用Decimal,则应使用GetDecimal()
。
显然,如果它不是Int
,您需要更改GetInt32
,请记得更改变量......
var val = new List<double>();
修改:根据无效演员的评论
nn.nn
或nulls
,则需要更改类型。