Ms access 为什么重复访问我的记录集结果而不缓存?

Ms access 为什么重复访问我的记录集结果而不缓存?,ms-access,vba,recordset,Ms Access,Vba,Recordset,我有一个名为products的DAO.Recordest,我这样分配它 Set products = db.OpenRecordset("Product URLs for Sitemap") “站点地图的产品URL”是一个查询,运行时使用自定义VBA函数填充其中一列 我期望发生的是products将在查询运行后包含查询的内容,就像一个表一样。然而,情况似乎并非如此 一旦我有了我的产品记录集,我就在它上面循环并从中创建一些XML Do While Not products.EOF Dim

我有一个名为
products
的DAO.Recordest,我这样分配它

Set products = db.OpenRecordset("Product URLs for Sitemap")
“站点地图的产品URL”是一个查询,运行时使用自定义VBA函数填充其中一列

我期望发生的是
products
将在查询运行后包含查询的内容,就像一个表一样。然而,情况似乎并非如此

一旦我有了我的
产品
记录集,我就在它上面循环并从中创建一些XML

Do While Not products.EOF
    Dim prdUrl As String
    Dim prdUpdated As String

    prdUrl = products!url
    prdUpdated = products!updated

    XML = XML & createUrlXml(products!url, products!updated)
    products.MoveNext
Loop
然而,在这个循环中,它在每个循环中调用“站点地图的产品URL”中使用的函数。这应该只需要做一次-在我通过调用
Set products=db.OpenRecordset(“站点地图的产品URL”)填充
products

为什么每次我循环查看
产品
记录集时都会调用此函数?如何停止此操作

感谢如何使用GetRows(),简单示例:

Dim queryText As String
queryText = "SELECT *, YourVBAFunc([URLs_SOURCE]) AS URL FROM Table1;"

Dim products As DAO.Recordset
Set products = CurrentDb.OpenRecordset(queryText)

products.MoveLast
products.MoveFirst

Dim data As Variant
data = products.GetRows(products.RecordCount)

' then all data are in the array 'data' ...
更多信息请点击此处:

我建议将查询“Sitemap的产品URL”转换为一个表,然后强制对所有行执行该函数。因此:

SELECT columnA, columnB ... yourFunction(args) 
INTO newTableName
FROM tableSpecification
那么您的循环将不会在每次迭代中执行该函数

如果此信息要更改(我猜是这样),请在完成后删除它,并在下次需要运行此逻辑时重新创建

如果数据需要特定于用户或会话,则可以使用计时器为tablename生成一个随机数:

newTableName = "myTableName" + replace(Timer,".","")

希望这个建议有帮助。

试试
db.OpenRecordset(“站点地图的产品URL”,dbOpenSnapshot)
看看是否有帮助。我已经尝试过了,同样的事情也发生了。之前,我使用了带有dbOpenSnapshot选项的QueryDef,但也发生了同样的事情。我刚刚完全按照您的建议进行了尝试,但没有成功。您是否尝试过完全删除
prdUrl
prdupped
,只留下
XML=
行和
产品。MoveNext
?似乎您正在请求
产品!url
一次循环迭代两次。这意味着
产品!url将移动两次。您的“自定义VBA函数”看起来如何?是否可以只执行一次?或者必须为记录集的每一行执行它?调用“Set”后未填充Recodset,您可以一条记录一条记录地读取它。。。这是从记录集中获取数据的常用方法。也许你正试图实现一些不可能的事情。是的,它必须在每一行执行。我基本上想要一个包含url和更新信息的对象数组,我想从查询中得到它。这真的不可能吗?我对VBA不是很了解,但对于PHP或任何其他语言,这将是微不足道的,我将尝试这个。我可以问一下你为什么建议
产品。MoveLast
产品。MoveFirst
?有时需要有效的记录计数:-)对不起…问了30秒后,我在你提供的链接中发现了这一点:)没问题。这里有另一个有用的链接:。。。观察4