Индекс был вне диапазона на ADOQuery - очень случайно - PullRequest
1 голос
/ 02 июня 2011

Я получаю 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. Трассировка стека показывает, что закрывать нечего.

Ответы [ 3 ]

0 голосов
/ 02 июня 2011
  selCursor := Cursor(selSQL); //Returns a DataSet from a TADOQuery

Возможно, проблема здесь, FieldByName находится в обработчике исключений, поэтому у вас есть ошибка в следующей строке.Вы должны проверить, в порядке ли Cursor ().

0 голосов
/ 03 июня 2011

Очень странно, и я до сих пор не знаю, почему, но кажется, что случайно Курсор уже закрыт.Кажется, что добавление:

if (selCursor.Active) then
    selCursor.Close;

решило проблему ...

Спасибо за ответы и потраченное время, пытаясь помочь.

0 голосов
/ 02 июня 2011

Что произойдет, если курсор вернет пустой набор данных?

Вы пытаетесь получить доступ к selCursor.FieldByName ... без записи, я думаю.

...