私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()
selCursor.Active
EDIT2:前のselCursor.Closeを確認するためにコードにチェックを入れました。スタックトレースは、閉じるものがないことを示しています。