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

Col*_*lin 3 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
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

3021 bof或eof为true或当前记录已被删除

当我在没有WHERE子句的同一函数中运行完全相同的查询时,如下所示:

strsql0 = "SELECT lnk_stockitm.C_C FROM lnk_stockitm;
Run Code Online (Sandbox Code Playgroud)

我得到了56,000条记录的正确结果.如果我将带有WHERE子句的完整SQL语句粘贴到常规查询中,如下所示:

SELECT lnk_stockitm.C_C FROM lnk_stockitm WHERE (((lnk_stockitm.C_C) Like 'T*'));
Run Code Online (Sandbox Code Playgroud)

它返回结果的正确子集(2800条记录).

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

Hea*_*utt 5

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

MSDN文章:在SQL语句中使用正确的通配符


Jak*_*lde 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
Run Code Online (Sandbox Code Playgroud)