1

我无法将值从 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个整数要读入,但我的数据必须有扩展空间。我怎样才能让它只读取整数而不引发索引错误?

4

2 回答 2

3

如果您查看获取字符串作为输入参数的索引器的 OleDbDataReader 的源代码,然后按照代码进行操作,您会注意到传递给索引器的字符串在可用字段名称之间进行搜索,如果未找到,则引发 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);
   }
于 2015-02-04T21:58:53.200 回答
2

当您运行类似的查询时

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

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

reader["Column1"]

不是

reader["Table1.Column1"]

您收到 IndexOutOfRange 异常,因为阅读器中没有名为“Event.EventDistance”的列。

于 2015-02-04T21:57:52.403 回答