ADOQuery上的索引超出范围 - 非常随机

时间:2011-06-02 08:55:51

标签: delphi adoconnection indexoutofboundsexception

我在我的网站上随机通过电子邮件发送给我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.Close之前的selCursor.Active。堆栈跟踪表明没有什么可以关闭的。

3 个答案:

答案 0 :(得分:0)

如果Cursor返回一个空数据集会怎样?

我认为你试图在没有记录的情况下访问selCursor.FieldByName ...

答案 1 :(得分:0)

非常奇怪,我仍然不知道为什么,但似乎随机的Cursor已经关闭。似乎在添加:

if (selCursor.Active) then
    selCursor.Close;

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

感谢您花时间寻求帮助的答案和时间。

答案 2 :(得分:-1)

  selCursor := Cursor(selSQL); //Returns a DataSet from a TADOQuery

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