Ms access Microsoft Access 2010内存泄漏DAO记录集和RUNSQL

Ms access Microsoft Access 2010内存泄漏DAO记录集和RUNSQL,ms-access,memory,vba,Ms Access,Memory,Vba,我的问题是,在更新循环的每次迭代中,我都会丢失大约100k的内存,所以最终,在几千次迭代之后,我会得到一个资源不足的错误 问题是,为什么我会失去记忆 下面是一个代码片段,它是更新数据的循环 标准是从本地数据库dao.recordset方法中提取的。-rs1 比较来自将在其中执行更新的目标数据库dao.recordset方法。-rs2是目标读取,以查看是否需要进行更新 更新是对链接sharepoint表的Docmd.Runsql查询。是的,我知道我可以使用.edit和.update,但在这种情况下

我的问题是,在更新循环的每次迭代中,我都会丢失大约100k的内存,所以最终,在几千次迭代之后,我会得到一个资源不足的错误

问题是,为什么我会失去记忆

下面是一个代码片段,它是更新数据的循环

标准是从本地数据库dao.recordset方法中提取的。-rs1

比较来自将在其中执行更新的目标数据库dao.recordset方法。-rs2是目标读取,以查看是否需要进行更新

更新是对链接sharepoint表的Docmd.Runsql查询。是的,我知道我可以使用.edit和.update,但在这种情况下,其他奇怪的事情会发生在不同的帖子上:

Access 2010进入Sharepoint 2010

Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset

Set db = CurrentDb
Set rs1 = db.OpenRecordset("datefix")

Do While Not rs1.EOF
    Set rs2 = db.OpenRecordset("select `Required delivery` from xyzzy where `SO Line` = '" & rs1.Fields(0).Value & "'")
    If rs1.Fields(1).Value = rs2.Fields("Required delivery") Then
    Else
        DoCmd.RunSQL "update ProblemTracking set `Required delivery` = '" & rs1.Fields(1).Value & "', `1st GI Dat` = '" & rs1.Fields(2).Value & "' where `SO Line` = '" & rs1.Fields(0).Value & "'"
    End If
    rs2.Close
    Set rs2 = Nothing

    rs1.MoveNext
Loop

考虑将VBA记录集转换为一个存储的操作查询。您可以看到,在SQL中,
JOIN
被视为显式连接,
其中
被视为隐式连接。优化器等效地运行这两个。和更新查询可以使用join语句。此外,与VBA查询相比,存储的查询由数据库进行分析、优化和缓存,并在内部存储最佳执行计划

如果我读对了代码,您有三个表:
datefix
xyzy
ProblemTracking
,所有这些表都由
SO行
连接起来(示例中
datefix
中的任何相应列都使用字段号而不是名称)。基本上,只要
xyzy
dateFix
对应的第二列不等于
[Required delivery]
中的
[Required delivery]
[1st GI Dat]
字段,您就需要更新
[Required delivery]

因此,考虑将以下更新查询保存为自己的对象,并在VBA中运行:


考虑将VBA记录集转换为一个存储的操作查询。您可以看到,在SQL中,
JOIN
被视为显式连接,
其中
被视为隐式连接。优化器等效地运行这两个。和更新查询可以使用join语句。此外,与VBA查询相比,存储的查询由数据库进行分析、优化和缓存,并在内部存储最佳执行计划

如果我读对了代码,您有三个表:
datefix
xyzy
ProblemTracking
,所有这些表都由
SO行
连接起来(示例中
datefix
中的任何相应列都使用字段号而不是名称)。基本上,只要
xyzy
dateFix
对应的第二列不等于
[Required delivery]
中的
[Required delivery]
[1st GI Dat]
字段,您就需要更新
[Required delivery]

因此,考虑将以下更新查询保存为自己的对象,并在VBA中运行:


是的,我正在观察MSACCESS.EXE内存大小随着每次迭代而增长。关闭时间越晚,内存似乎以每次迭代100k的速度增长。请尝试使用currentdb.Execute。docmd被包装在一个事务中,这“可能”是内存没有被释放的原因。是的,我正在观察MSACCESS.EXE内存大小随着每次迭代而增长。关闭时间越晚,内存似乎以每次迭代100k的速度增长。请尝试使用currentdb.Execute。docmd被封装在一个事务中,这“可能”是内存没有被释放的原因。假设有很多方法可以剥这只猫的皮,并且您提供了3个好的和有趣的变体,问题仍然存在,为什么在我的示例中会出现内存泄漏??:)这可能是由于各种原因造成的(数据库大小、表大小、用户、VBA垃圾收集器、RAM、磁盘空间等)。我提供了一些更有效的策略,特别是在每次循环迭代时创建/销毁记录集,而不是进行剖析和推测。让我知道上述方法是否有助于减少内存泄漏。假设有很多方法可以剥这只猫的皮,并且您提供了3种很好且有趣的变体,问题仍然是,为什么在我的示例中会出现内存泄漏??)这可能是由于各种原因造成的(数据库大小、表大小、用户、VBA垃圾收集器、RAM、磁盘空间等)。我提供了一些更有效的策略,特别是在每次循环迭代时创建/销毁记录集,而不是进行剖析和推测。让我知道,如果以上有助于内存泄漏。
UPDATE (ProblemTracking 
INNER JOIN datefix ON ProblemTracking.`SO Line` = datefix.`FirstColumn`)
INNER JOIN xyzzy ON xyzzy.`SO Line` = datefix.`FirstColumn`
  SET `Required delivery` = datefix.`SecondColumn`, `1st GI Dat` = datefix.`ThirdColumn` 
WHERE datefix.SecondColumn <> xyzzy.`Required delivery` 
UPDATE ProblemTracking 
INNER JOIN datefix
ON ProblemTracking.`SO Line` = datefix.`FirstColumn`
WHERE datefix.SecondColumn <> 
      DLookUp("[Required delivery]", "xyzzy", "[SO Line]='" & datefix.FirstColumn & "'")
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb

' PULLING ONLY NEEDED COLUMNS IN JOIN OF THREE TABLES
strSQL = "SELECT datefix.`FirstColumn`, datefix.`SecondColumn`, datefix.`ThirdColumn`" _ 
          & " FROM (ProblemTracking" _ 
          & " INNER JOIN datefix ON ProblemTracking.`SO Line` =  datefix.`FirstColumn`)" _
          & " INNER JOIN xyzzy ON xyzzy.`SO Line` = datefix.`FirstColumn`" _
          & " WHERE datefix.SecondColumn <> xyzzy.`Required delivery`;" 

Set rs = db.OpenRecordset(strSQL)

rs.MoveLast
rs.MoveFirst

Do While Not rs.EOF
    DoCmd.RunSQL "UPDATE ProblemTracking 
                  SET `Required delivery` = '" & rs.Fields(1).Value & "', 
                      `1st GI Dat` = '" & rs.Fields(2).Value & "' 
                  WHERE `SO Line` = '" & rs.Fields(0).Value & "'"
    rs.MoveNext
Loop

rs.Close
Set rs = Nothing