从 Access 数据库读取字段时出现 IndexOutOfRangeException

IndexOutOfRangeException when reading in a field from an Access Database

我在将值从 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个,但我的数据一定要有扩展空间。我该怎么做才能让它只读入整数而不会引发索引错误?

当您运行查询

SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 ...

OleDbDataReader 中的结果列(通常)仅命名为 "Column1" 和 "Column2",因此要引用它们,您只需使用

reader["Column1"]

没有

reader["Table1.Column1"]

您收到 IndexOutOfRange 异常,因为 reader 中没有名为 "Event.EventDistance" 的列。

如果您查看获取字符串作为输入参数的 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);
   }