1

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index在我的网站上随机通过电子邮件发送给我。我无法通过强制或一般测试重现此错误,这有点令人困惑。

从我在堆栈跟踪中可以看到,它在打开数据集并尝试获取值时随机发生。堆栈跟踪显示调用此函数时出现错误:

function TDB.FGetLastInsertID: Integer;
const
  selSQL = 'select scope_identity() as LastID';
var
  selCursor: TDataSet;
begin
  selCursor := Cursor(selSQL); //Returns a DataSet from a TADOQuery
  try
     Result := selCursor.FieldByName('LASTID').AsInteger;
  finally
     selCursor.Close;
     selCursor.Free;
  end;
end;

正如我所说,我无法让它重现错误,并且它似乎在我运行的任何查询中随机发生。我尝试关闭连接,将其设置为非活动等以重现错误但不能。

有没有人有任何想法?

编辑:在更仔细地检查堆栈跟踪之后,它似乎是导致问题的原因:

Stack Trace: at 
System.Collections.ArrayList.get_Item(Int32 index) at 
Borland.Vcl.TList.Delete(Int32 Index) at Borland.Vcl.TList.Remove(Object Item) at 
Borland.Vcl.TDBBufferList.FreeHGlobal(IntPtr Ptr) at 
Borland.Vcl.TCustomADODataSet.FreeRecordBuffer(IntPtr& Buffer) at 
Borland.Vcl.TDataSet.SetBufListSize(Int32 Value) at  
Borland.Vcl.TDataSet.CloseCursor() at  
Borland.Vcl.TDataSet.SetActive(Boolean Value) at Borland.Vcl.TDataSet.Close() 

EDIT2:我检查了代码以确保selCursor.Active在 selCursor.Close 之前。堆栈跟踪表明没有什么可以关闭的。

4

3 回答 3

0

如果 Cursor 返回一个空的 Dataset 会发生什么?

selCursor.FieldByName ...我认为,您尝试在没有记录的情况下访问。

于 2011-06-02T10:19:32.480 回答
0

很奇怪,我仍然不知道为什么,但似乎光标已经随机关闭了。似乎添加:

if (selCursor.Active) then
    selCursor.Close;

已对问题进行了排序...

感谢您的答案和花费时间试图提供帮助。

于 2011-06-03T13:57:33.593 回答
-1
  selCursor := Cursor(selSQL); //Returns a DataSet from a TADOQuery

也许问题就在这里,FieldByName 在异常处理程序中,所以下一行有错误。您必须检查 Cursor() 是否正常。

于 2011-06-02T12:05:57.057 回答