RecordSet 克隆 RecordCount 等于 0?

Posted

技术标签:

【中文标题】RecordSet 克隆 RecordCount 等于 0?【英文标题】:RecordSet Clone RecordCount Equals 0? 【发布时间】:2014-02-03 21:30:04 【问题描述】:

我有点困惑,为什么这没有找到记录数。我的表“tblDatabase”有 3 条记录。我希望它克隆记录集,以便我们实际上不会更改任何记录。我们只想在浏览数据时读取它们,然后进一步浏览被选中的项目(在这种情况下,字段“SELECT”设置为 True)。

谁能告诉我我做错了什么? RecordCount 一直返回为 0。尝试使用 RS1.MoveLast、MoveNext 等...但返回结果相同。非常感谢对我做错的任何帮助!

Set RS1 = CurrentDb.OpenRecordset("tblDatabase").Clone

    RS1.MoveFirst
    Debug.Print RS1.RecordCount

    For i = 1 To RS1.RecordCount
        If RS1.Fields("Select") = True Then

            strRequestNo = strRequestNo & IIf(Len(strRequestNo) = 0, "", ",") & Str(RS1.Fields("Request No"))
            strName = RS1.Fields("Name")

            'Pops up the Approval Dialog for user to Name + Date Approved.
            'The Code should not continue until the form is closed.
            DoCmd.OpenForm "frmClientAuthorization", acNormal, , , acFormEdit, acDialog, strRequestNo & "|" & strClientName


        End If
        RS1.MoveNext
    Next i

【问题讨论】:

是第三行(Debug.Print RS1.RecordCount)返回零吗? 是的,第 3 行返回 0,但是,我已将第 2 行更改为 RS1.MoveLast,它仍然为 Debug.Print 返回 0。 我尝试在下面回答。 尝试将CurrentDb.OpenRecordset("tblDatabase").Clone 更改为CurrentDb.OpenRecordset("tblDatabase", dbOpenSnapshot) 【参考方案1】:

Please note that clone does not make a recordset read only.你真的不需要那个。

如果你想要一个只读记录集,我建议在打开记录集时使用 dbReadOnly 的 RecordsetOptionEnum 值:

How to open a record set

RecordsetOptionEnum

关于它返回零记录数,您需要指定打开一个表类型的记录集:

'Open a table-type Recordset
 Set rsTable = dbs.OpenRecordset("tblDatabase", dbOpenTable)

另外,这里有(在我看来)两种更优雅的循环记录集的方法:

Example 1

Example 2

HTH,

埃里克

【讨论】:

抱歉 - 我将第 1 行更改为: Set RS1 = CurrentDb.OpenRecordset("tblDatabase") 但是,它仍然保持不变。我假设这就是您所说的“摆脱克隆”的意思?不过谢谢你的建议。 是的,我做到了,但我错了。这要追溯到十多年前,所以我有点生疏了。您确定您的数据库中有一个名为 tblDatabase 的表并且其中有记录吗?也许 CurrentDb 没有指向您认为的位置。 也许你需要指定你正在打开一个表:Set rsTable = dbs.OpenRecordset("Table1", dbOpenTable)【参考方案2】:

如果你使用“for i = ...”,那么你需要做一个 rs1.movelast myvar = rs1.recordcount rs1.movefirst 以了解有多少记录与记录集匹配。

在 for-next 循环中使用 myvar 变量

执行任务的更简洁的方法是:

RS1.MoveLast
Debug.Print RS1.RecordCount

Do Until rs1.EOF = True
    If RS1.Fields("Select") = True Then

        strRequestNo = strRequestNo & IIf(Len(strRequestNo) = 0, "", ",") & Str(RS1.Fields("Request No"))
        strName = RS1.Fields("Name")

        'Pops up the Approval Dialog for user to Name + Date Approved.
        'The Code should not continue until the form is closed.
        DoCmd.OpenForm "frmClientAuthorization", acNormal, , , acFormEdit, acDialog, strRequestNo & "|" & strClientName


    End If
    RS1.MoveNext
Loop

【讨论】:

以上是关于RecordSet 克隆 RecordCount 等于 0?的主要内容,如果未能解决你的问题,请参考以下文章

MS-Access Recordset to Array,值被转置

我用vb6.0做了一个数据库,在查询的时候对查询结果进行计数,我查询出4条记录在Label1中提示4条记录.

SQL克隆/复制同一表中的记录与条件

为啥要克隆 MS-Access 记录集?

用asp统计一个数据表里记录的条数

session的值要如何获取