将Datareader计算结果存储在List c#中

时间:2013-11-25 20:38:25

标签: c#

我有一个计算项目成本的方法,但是需要对我的数据库中的每一行执行计算,一旦计算完成,我想将它存储在列表中但是我收到错误。

到目前为止,我有:

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中运行语句时,它会给我预期的结果。

2 个答案:

答案 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>();

修改:根据无效演员的评论

  1. 你在哪里得到错误?
  2. 这个'TotalCost'字段是什么样的。
  3. 运行查询,并检查数据。如果你有非int ,例如nn.nnnulls,则需要更改类型。