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() 

selCursor.ActiveEDIT2:前のselCursor.Closeを確認するためにコードにチェックを入れました。スタックトレースは、閉じるものがないことを示しています。

4

3 に答える 3

0

非常に奇妙で、理由はまだわかりませんが、カーソルがランダムに閉じられているようです。追加するようです:

if (selCursor.Active) then
    selCursor.Close;

問題を分類しました...

回答と時間を割いて助けてくれてありがとう。

于 2011-06-03T13:57:33.593 に答える
0

Cursor が空の Dataset を返すとどうなりますか?

レコードなしでにアクセスしようとしているselCursor.FieldByName ...と思います。

于 2011-06-02T10:19:32.480 に答える
-1
  selCursor := Cursor(selSQL); //Returns a DataSet from a TADOQuery

ここに問題がある可能性があります。FieldByName は例外ハンドラにあるため、次の行にエラーがあります。Cursor() が正常かどうかを確認する必要があります。

于 2011-06-02T12:05:57.057 に答える