错误代码3021 bof或eof为true或当前记录已被删除

时间:2009-11-11 01:13:47

标签: ms-access access-vba

我有一个Access 2003数据库,其中包含一些使用ADO调用的可视化基本代码。当我做的时候

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 bof或eof为真或当前记录已删除

当我在没有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条记录)。

谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:5)

使用ADO时,您需要使用'%'字符作为通配符。

MSDN Article: Using the Right Wildcard Characters in SQL Statements

答案 1 :(得分:5)

通配符差异是您从ADO执行的操作与访问数据库之间的差异的原因。将语句转换为使用“%”而不是“*”。作为一般经验法则,在调用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