从 Access 数据库中读取字段时出现 IndexOutOfRangeException
Posted
技术标签:
【中文标题】从 Access 数据库中读取字段时出现 IndexOutOfRangeException【英文标题】:IndexOutOfRangeException when reading in a field from an Access Database 【发布时间】:2015-02-04 21:47:08 【问题描述】:我在将值从 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个整数要读入,但我的数据必须有扩展空间。如何让它只读取整数而不引发索引错误?
【问题讨论】:
【参考方案1】:如果您查看将字符串作为输入参数的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);
【讨论】:
【参考方案2】:当你运行类似的查询时
SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 ...
OleDbDataReader 中的结果列(通常)只是命名为“Column1”和“Column2”,因此要引用它们,您只需使用
reader["Column1"]
不是
reader["Table1.Column1"]
您收到 IndexOutOfRange 异常,因为阅读器中没有名为“Event.EventDistance”的列。
【讨论】:
非常感谢...我一直在强调这一点,但它解决了我的错误。再次感谢您!以上是关于从 Access 数据库中读取字段时出现 IndexOutOfRangeException的主要内容,如果未能解决你的问题,请参考以下文章
从 Access 导出到 Excel 时出现日期超出范围错误
在 INSERT INTO 语句中插入值时出现语法错误。 -VB 和 ACCESS 2013
读取 NSFetchedResultsController 的 fetchedObjects 属性时出现 EXC_BAD_ACCESS 错误(仅在模拟器上)