从Access数据库中读取字段时的IndexOutOfRangeException

时间:2015-02-04 21:47:09

标签: c# .net ms-access oledb oledbdatareader

我无法从Access数据库中将值读入列表。值看起来像这样: 字段称为EventDistance 价值观是 77 77 77 77 55 112 45 46

我的代码如下所示:

 private void StartSchedule_Click(object sender, EventArgs e)
    {
        string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\A2 Computing\C# Programming Project\TriHard.accdb";
        string SelectQuery = "SELECT Time.AthleteID, Athlete.AthleteName,
                              Time.EventTime, Event.EventDistance 
                              FROM Event INNER JOIN 
                                   (Athlete INNER JOIN [Time] 
                                    ON Athlete.[AthleteID] = Time[AthleteID]) 
                                    ON Event.[EventID] = Time.[EventID];";

        OleDbConnection Connection = new OleDbConnection(ConnectionString);
        OleDbCommand Command = new OleDbCommand(SelectQuery, Connection);
        Command.Connection.Open();
        OleDbDataReader Reader = Command.ExecuteReader(CommandBehavior.CloseConnection);

        PaceCalculator pace = new PaceCalculator();
        List<PaceCalculator> Distancelist = new List<PaceCalculator>();
        while (Reader.Read())
               {
                   pace.Distance = (int)Reader["Event.EventDistance"];
                   Distancelist.Add(pace);
               }

它的抛出IndexOutOfRanceException未对Event.EventDistance进行处理。只读入8个整数,但我的数据必须有扩展空间。我如何才能使它只读取整数而不会抛出索引错误?

2 个答案:

答案 0 :(得分:3)

如果查看获取字符串作为输入参数的source code of the OleDbDataReader for the indexer然后按照代码,您会注意到传递给索引器的字符串是在可用的字段名称之间搜索的,如果没有找到,则会在抛出IndexOutOfRange异常。

在您的查询中,没有名为"Event.EventDistance"的字段 有一个名为EventDistance的字段(表名应该从Reader索引器中删除。

但是你还有另外一个问题,你的循环会在列表中重复添加相同的PaceCalculator实例 因此,在每个循环中,您将EventDistance设置为相同的PaceCalculator实例,并将其一次又一次地添加到列表中。在循环结束时,列表中充满了指向同一个PaceCalculator实例的元素,并且此实例具有读取的最后一个记录的值。

您可以解决此问题,在循环中移动实例的创建

   List<PaceCalculator> Distancelist = new List<PaceCalculator>();
   while (Reader.Read())
   {
       PaceCalculator pace = new PaceCalculator();
       pace.Distance = (int)Reader["EventDistance"];
       Distancelist.Add(pace);
   }

答案 1 :(得分:2)

当你运行像

这样的查询时
SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 ...

OleDbDataReader中的结果列(通常)仅命名为&#34; Column1&#34;和&#34; Column2&#34;,所以要引用它们,你只需要使用

reader["Column1"]

reader["Table1.Column1"]

您收到一个IndexOutOfRange异常,因为读者中没有名为&#34; Event.EventDistance&#34;的列。