我在我的网站上随机通过电子邮件发送给我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
。堆栈跟踪表明没有什么可以关闭的。
答案 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()是否正常。