【问题标题】:error code 3021 either bof or eof is true or the current record has been deleted错误代码 3021 bof 或 eof 为真或当前记录已被删除
【发布时间】:2009-11-11 01:13:46
【问题描述】:

我有一个 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 条记录)。

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

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

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

    【讨论】:

    • 好尴尬。我很久以前就读到过这个,并且很长时间没有需要使用它,我忘记了。感谢您首先检查 EOF。我实际上已经在这样做了。我只是删掉了所有代码,以尽量减少导致我的错误的情况,以便人们快速轻松地查看。
    【解决方案2】:

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

    MSDN Article: Using the Right Wildcard Characters in SQL Statements

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多