我有一个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条记录)。
谁能告诉我我做错了什么?
答案 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