2011-06-02 40 views
1

我得到Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index隨機通過電子郵件發送給我在我的網站上。我無法通過強制或一般測試來重現此錯誤,這有點令人困惑。索引超出了ADOQuery的範圍 - 非常隨機

從我在堆棧跟蹤中可以看到的情況來看,它在打開數據集並嘗試獲取值時會隨機發生。堆棧跟蹤顯示調用這個函數時,我得到了錯誤:

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。堆棧跟蹤表明沒有任何關閉。

+1

請問這是什麼「光標()」的東西?從什麼時候開始使用Delphi?我可以在網上的任何地方閱讀嗎? – 2011-06-02 12:23:51

+0

它是一個返回一個打開的數據集的自定義函數。 – webnoob 2011-06-02 12:44:06

+0

對,謝謝!我確實懷疑這一點,但是,不,爲什麼,我開始認爲這是最新版本中的一項新功能。 – 2011-06-02 12:52:41

回答

0

很奇怪,我仍然不知道爲什麼,但似乎隨機光標已經關閉。似乎增加:

if (selCursor.Active) then 
    selCursor.Close; 

已排序的問題...

感謝您的答案和所花費的時間試圖幫助。

0

如果光標返回空數據集,會發生什麼?

您嘗試訪問selCursor.FieldByName ...沒有記錄,我想。

+0

它可以很好地處理空數據集。 FieldByName不會嘗試訪問索引,因此它的奇怪..請參閱我的編輯到主帖子(現在添加)。 – webnoob 2011-06-02 10:31:06

+0

不過,我會嘗試使用'selCursor.Fields(0).AsInteger'替代'FieldByName'(無法開始查看Delphi - 無法從我現在輸入的地方開始)。只是一個猜測。 – Edelcom 2011-06-02 11:48:01

+0

按照你的建議做是更可能導致一個錯誤,因爲如果遊標是空的,那麼它將不會在索引0處有一個值。然後這會拋出索引超出界限錯誤... FieldByName(AFAIK)允許這種情況發生。 – webnoob 2011-06-02 12:43:42

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

也許問題在這裏,FieldByName是在異常處理程序,所以你有錯誤的下一行。你必須檢查Cursor()是否正常。

+0

FieldByName不在異常處理程序中,如果光標無效,將返回錯誤。 – webnoob 2011-06-02 12:42:28