我在从Access数据库中将值读取到列表中时遇到问题。值如下所示:字段称为EventDistance值为77777777551124546
我的代码如下:
private void StartSchedule_Click(object sender, EventArgs e)
{
string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:A2 ComputingC# Programming ProjectTriHard.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);
}
Event.EventDistance未处理其抛出的IndexOutOfRanceException。只有8个整数可读取,但我的数据必须有扩展空间。如何使它只读取整数而不引发索引错误?
如果您查看索引器的OleDbDataReader的源代码,该索引器获取字符串作为输入参数,然后跟随该代码,您会注意到传递给索引器的字符串在可用的字段名称之间进行搜索,如果未找到,则会引发IndexOutOfRange异常。
在您的查询中,没有名为"Event.EventDistance"
的字段
有一个名为EventDistance
的字段(表名应该从阅读器索引器中删除
但您也有另一个问题,您的循环会将相同的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);
}
当您运行类似的查询时
SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 ...
OleDbDataReader中的结果列(通常)仅命名为"第1列"one_answers"第2列",因此要引用它们,只需要使用
reader["Column1"]
不是
reader["Table1.Column1"]
由于读取器中没有名为"Event.EventDistance"的列,您将获得IndexOutOfRange异常。