2009-11-11 78 views
3

我有一個使用ADO調用的可視基本代碼的Access 2003數據庫。當我做了錯誤代碼3021 bof或eof是真的還是當前記錄已被刪除

strsql0 = "SELECT lnk_stockitm.C_C FROM lnk_stockitm WHERE (((lnk_stockitm.C_C) Like 'T*'));" 
newRS.Open strsql0, cn1, adOpenKeyset, adLockReadOnly 
newRS.movelast 

我得到這個錯誤:

3021 either bof or eof is true or the current record has been deleted

當我運行在相同的功能完全相同的查詢,而WHERE子句,像這樣:

strsql0 = "SELECT lnk_stockitm.C_C FROM lnk_stockitm; 

我得到56,000條記錄的正確結果。如果我用粘貼WHERE子句完整的SQL語句轉換成常規查詢,像這樣:

SELECT lnk_stockitm.C_C FROM lnk_stockitm WHERE (((lnk_stockitm.C_C) Like 'T*')); 

它返回的結果(2800條記錄)的正確的子集。

誰能告訴我我做錯了什麼?

回答

5

通配符的區別是你從ADO和Access數據庫中執行什麼區別的原因。將您的語句轉換爲使用「%」而不是「*」。作爲一般的經驗法則,在調用MoveLast之前通過檢查eof封裝代碼可能是一個好主意。如果您的查詢結果爲零,則每次都會彈出。

strsql0 = "SELECT lnk_stockitm.C_C FROM lnk_stockitm WHERE (((lnk_stockitm.C_C) Like 'T*'));" 
newRS.Open strsql0, cn1, adOpenKeyset, adLockReadOnly 

if not newRs.eof then 
    newRS.movelast 
else 
    ' do something here if necessary to handle blank results 
end if 
+0

多麼尷尬。我很久以前就讀過這方面的內容,並且沒有必要長時間使用它,我忘記了。 感謝您的領導,首先檢查EOF。我實際上已經這樣做了。我只是刪除了所有的代碼,以達到導致我的錯誤的最小案例,讓人們快速輕鬆地查看。 – Colin 2009-11-12 15:03:02

相關問題