[英]Why am I getting this exception
我有一个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
}
}
这是RecordManager.NewRecordBase的反编译代码
internal int NewRecordBase()
{
int num;
if (this.freeRecordList.Count != 0)
{
num = this.freeRecordList[this.freeRecordList.Count - 1];
this.freeRecordList.RemoveAt(this.freeRecordList.Count - 1);
}
else
{
if (this.lastFreeRecord >= this.recordCapacity)
this.GrowRecordCapacity();
num = this.lastFreeRecord;
++this.lastFreeRecord;
}
return num;
}
正如您所看到的,唯一可能出现“索引越界”异常的情况如下:
num = this.freeRecordList[this.freeRecordList.Count - 1];
因为DataTable不是线程安全的,所以我们可以很容易地想象一个场景,在访问freeRecordList[..]
但是在访问this.freeRecordList.Count
之后,另一个线程删除了一个记录。
在这种情况下,freeRecordList.Count会在同时=>索引越界异常中发生变化。
因此,如果我是你, 我会尝试找到一个并发问题 (在极少数情况下它发生的事实是另一个论点!)
检查表中允许的小数位数,并检查您提交的数字的小数位数。
如果小数位数超出范围,则可以抛出此异常。
获取包含错误的DataRow对象数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.