2011-05-13 28 views
2

在使用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是在同一個方向運動。這解釋了爲什麼它也導致錯誤。 我只是希望我沒有認爲會導致類似的問題,所有的移動方法

+2

爲什麼在世界上,你是通過走記錄集而不是通過發出SQL DELETE語句來進行刪除? – 2011-05-13 20:44:14

+0

也許是因爲他認爲他可以自由使用記錄集對象的刪除方法? – 2011-05-14 04:56:46

+0

@Phillippe正是!在我嘗試從DAO轉向ADO之前,它也做了很多年的工作。 – jjb 2011-05-14 08:02:37

回答

3

http://msdn.microsoft.com/en-us/library/ms675787(v=vs.85).aspx

如果刪除Recordset對象中最後剩下的 戰績, BOF和EOF屬性可能會保持爲 False,直到您嘗試重新定位 當前記錄。

由於ADO不是DAO,行爲上的差異不應該太令人吃驚。似乎對MoveLast的調用可能觸發對BOF/EOF的更新。我想你可能會被迫進行編碼變更。

踢和笑聲,讓這個嘗試(不知道是否它會工作):

rset.Delete 
rset.MoveNext 
If rset.BOF <> True Or rset.EOF <> True Then     
    rset.MoveLast    
End If 

http://msdn.microsoft.com/en-us/library/ms677527(v=vs.85).aspx

使用MoveNext方法移動 電流記錄位置一個記錄 前進(朝向 記錄集的底部)。如果最後一條記錄是 當前記錄,並且您調用 MoveNext方法,則ADO會將當前的 記錄設置爲記錄集中最後一條 記錄(EOF爲True)後的位置。 如果 EOF屬性已爲True,則嘗試向前移動會生成 錯誤。

+0

謝謝你解釋這個。不幸的是,rset.movenext似乎不起作用,拋出同樣的錯誤。實際上,我認爲我的解決方案實際上沒有。我編輯了這個問題來反映這一點。我認爲有必要按照David-W-Fenton在他的評論中提出的建議進行重寫。 – jjb 2011-05-14 08:06:56

+0

@jjb - 大衛的答案是最好的方法。祝你好運! – rskar 2011-05-16 19:25:45

+0

我做了一個與這個問題有關的小發現,這可能是你感興趣的,並相應地編輯了這個問題 – jjb 2011-06-19 12:07:39

相關問題