【发布时间】:2013-11-08 19:32:39
【问题描述】:
我有一个 System.Data.DataSet 和 1 个单表。该表有很多列。
在某个事件处理程序中,我正在为已经存在的数据行中的一个字段设置十进制值(在设置时)。
在极少数情况下,我会收到 ArgumentOutOfRangeException 异常。
消息:System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。
调用堆栈:
at System.ThrowHelper.ThrowArgumentOutOfRangeException()
at System.Collections.Generic.List`1.get_Item(Int32 index)
at System.Data.RecordManager.NewRecordBase()
at System.Data.DataTable.NewRecord(Int32 sourceRecord)
at System.Data.DataRow.BeginEditInternal()
at System.Data.DataRow.set_Item(DataColumn column, Object value)
at CPITS.Data.OrdersRow.set_ExecutionPrice(Decimal value)
奇怪的是,这是在框架生成的代码中发生的(当然,我没有为 DataColumn 编写 Setter)。
你能帮我理解和解决这个问题吗?
编辑
下面是我设置值的代码:
void ibclient_OrderStatus(object sender, OrderStatusEventArgs e)
{
Data.OrdersRow drOrders = data.Orders.FindByOrderId(e.OrderId);
if (drOrders != null)
{
drOrders.FilledQuantity = e.Filled;
drOrders.ExecutionPrice = e.AverageFillPrice; //Sporadic Exception when setting a decimal value
}
}
【问题讨论】:
-
你能展示你在抛出异常时用来调用它的代码吗?很明显,有些东西试图索引集合中不存在的元素。在没有看到代码或不知道运行时值的情况下,我无法比这更具体。
-
对不起。添加了相关代码..
-
我没有看到代码和异常之间的联系。在哪一行代码中抛出了异常?发生这种情况时的运行时值是多少?
-
代码和异常的联系可以在调用栈的最后一行看到。代码试图在 if 块的第二行中设置一个十进制值,这就是“必须”发生异常的地方。 ('必须',因为这发生在生产环境中;)
-
请检查 e.AvaerageFillPrice 是否与 ExecutionPrice 数据类型相同,是否在该数据类型范围内。
标签: c# c#-4.0 dataset indexoutofboundsexception