在使用Access 97數據庫的VB6項目中將ADO替換爲ADO後,會發生這種情況。代碼在DAO中正常但在ADO中給出運行時錯誤'3021'
它發生在標有「錯誤在這裏,在下面的代碼片段:
If rset.BOF <> True Or rset.EOF <> True Then
rset.MoveLast
Do While rset.BOF <> True
rset.Delete
If rset.BOF <> True Or rset.EOF <> True Then
rset.MoveLast 'Error Here
End If
Loop
End If
運行時錯誤 '線3021' gves這樣的解釋:
「無論是EOF或BOF爲True,或 當前記錄已被刪除。 請求的操作需要當前的 記錄。「
看來,在記錄的最後一條記錄被刪除之後BOF +/- EOF仍然在代碼的ADO版本的假,而兩者在DAO版本真。 如果我改變這樣的代碼它可以工作
編輯:下面的代碼不起作用。當我嘗試這個'解決方案'時,所有記錄 已經從表中刪除,因此整個塊被繞過,所以沒有錯誤發生。對不起的信息。
If rset.BOF <> True Or rset.EOF <> True Then
rset.MoveLast
Do While rset.BOF <> True
rset.Delete
If rset.BOF <> True Or rset.EOF <> True Then
End If
If rset.BOF <> True Or rset.EOF <> True Then
rset.MoveLast
End If
Loop
End If
有人能解釋一下嗎? (理想情況下提供不涉及改變代碼的解決方案!)
進一步編輯:據我可以告訴有嘗試過很多方法,BOF和EOF是無用的ADO用於測試後,一個空的記錄刪除。這是因爲您需要使用其中一種移動方法來更新BOF/EOF,如果記錄集爲空,則會出現錯誤。在我使用的記錄集上,RecordCount屬性在刪除後被更新。雖然我不打算使用它,這個代碼做工作:
If rset.BOF <> True Or rset.EOF <> True Then
Do While rset.RecordCount > 0
rset.MoveLast
rset.Delete
Loop
End If
編輯(1個月後) 因此重寫代碼一大堆之後,我遇到含有刪除沒一個循環來了沒有錯誤。唯一的區別是這個循環每次都刪除記錄集中的第一條記錄,而不是最後一條記錄,因此在每次刪除它後執行 MOVEFIRST而不是MOVELAST。 因此,我儘可能減少了代碼,下面的代碼片段可以在使用ADO的VB6上同時適用Postgresql和Access兩個數據庫,我試過它。
Do While rset.EOF <> True
rset.Delete
rset.MoveFirst
Loop
最終記錄EOF和BOF的刪除後仍然假,但你不會得到一個錯誤調用MoveFirst方法。調用MOVEFIRST現在將EOF和BOF設置爲true,並退出循環。 相反,如果將MOVEFIRST方法替換爲MOVELAST,則兩個數據庫都會發生(3021)錯誤。 在他的回答rskar引述這從MSDN
使用MoveNext方法移動 當前記錄位置的一個記錄 向前(朝 Recordset的底部)。如果最後一個記錄是 當前記錄和調用 MoveNext方法,ADO將當前 記錄位置記錄集中的最後 記錄後(EOF爲True)。 如果 EOF屬性已爲True,則嘗試向前移動會生成 錯誤。
他們提到MOVENEXT造成的錯誤,我想既然MOVELAST是在同一個方向運動。這解釋了爲什麼它也導致錯誤。 我只是希望我沒有認爲會導致類似的問題,所有的移動方法
爲什麼在世界上,你是通過走記錄集而不是通過發出SQL DELETE語句來進行刪除? – 2011-05-13 20:44:14
也許是因爲他認爲他可以自由使用記錄集對象的刪除方法? – 2011-05-14 04:56:46
@Phillippe正是!在我嘗試從DAO轉向ADO之前,它也做了很多年的工作。 – jjb 2011-05-14 08:02:37