2009-11-11 1 views
3

У меня есть база данных Access 2003 с некоторым визуальным базовым кодом, использующим в ней вызовы ADO. Когда я делаюкод ошибки 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

Когда я бегу точно такой же запрос в одной и той же функции без ИНЕКЕ, как это:

strsql0 = "SELECT lnk_stockitm.C_C FROM lnk_stockitm; 

I получить правильный результат из 56 000 записей. Если я вставляю полное заявление SQL с предложением WHERE в обычный запрос, например, так:

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

возвращает правильное подмножество результатов (2800 записей).

Может ли кто-нибудь сказать мне, что я делаю неправильно?

ответ

5

Разница подстановочной является причиной разницы между тем, что вы выполняете с ADO и в базе данных доступа. Преобразуйте ваше заявление в использование «%», а не «*». Как общее правило, может быть хорошей идеей инкапсулировать ваш код, проверив eof перед вызовом MoveLast. Если ваш запрос имеет нулевые результаты, он будет бомбить каждый раз.

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

Смежные вопросы

 Смежные вопросы