C# 为什么我会得到这个例外

C# 为什么我会得到这个例外,c#,c#-4.0,dataset,indexoutofboundsexception,C#,C# 4.0,Dataset,Indexoutofboundsexception,我有一个System.Data.DataSet和一个表。该表有许多列 在某个事件处理程序中,我正在为其中一个字段设置一个十进制值,该字段位于(设置时)已经存在的数据行中 在一个非常罕见的情况下,我得到了一个ArgumentOutOfRangeException异常 消息:System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小 调用堆栈: at System.ThrowHelper.ThrowArgumentOutOfRangeEx

我有一个System.Data.DataSet和一个表。该表有许多列

在某个事件处理程序中,我正在为其中一个字段设置一个十进制值,该字段位于(设置时)已经存在的数据行中

在一个非常罕见的情况下,我得到了一个
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将在同时=>index越界异常中发生更改

因此,如果我是你,我会尝试查找并发问题(在极少数情况下发生的事实是另一个论点!)

获取包含错误的DataRow对象数组


检查表中允许的小数位数,并检查您提交的数字的小数位数


如果小数位数超出范围,则会引发此异常。

能否显示引发异常时用于调用此异常的代码?显然,有人试图索引集合中不存在的元素。在没有看到代码或不知道运行时值的情况下,我不能说得更具体了。对不起。添加了相关代码..我看不到代码和异常之间的联系。在哪一行代码上引发异常?发生这种情况时的运行时值是什么?代码和异常之间的连接可以在调用堆栈的最后一行看到。代码试图在if块的第二行中设置十进制值,而这正是发生异常“必须已”的地方。(“必须有”,因为这是在生产环境中发生的;)请检查e.AverageFillPrice是否与ExecutionPrice的数据类型相同,并且是否在该数据类型的范围内。这是一个MS内部集合,在drOrders.ExecutionPrice setter上修改。我给出的代码是System.Data.RecordManager.NewRecordBase()的反编译代码,它位于stacktrace中。这不是一个例子。你的论点对于你给出的例子是正确的,但是这个例子并没有说明我的情况。我没有任何类型的显式集合(如您的
freeRecordList
),我正在检查并尝试访问它的计数。我所拥有的只是数据行的DataSet->DataTable->(隐式)集合。我正在查询一行,然后,如果该行存在,我将更新该行的一列。更新时(即异常发生时),我没有处理任何集合。@Viv:我可以向您保证,您不会有任何其他答案。密码不要撒谎,我是对的:/我对此表示怀疑!,原因如下。1.我没有在表2中指定任何限制。这段代码执行了很多次。您必须在表中指定限制,即SQL语法(例如,您的类型可以是
decimal(18,2)
)。如果未指定此选项,将使用默认值。检查此链接时出现类似问题:。