ACCESS 2010系统资源超出

时间:2013-10-23 19:10:43

标签: forms vba ms-access access-vba ms-access-2010

我的团队正在使用Access 2000,我们有MDB项目。该应用程序(ERP)可以打开大约20个访问表单。在我们决定将整个系统迁移到Access 2010到新格式之后,* .accdb;我们现在遇到的问题是内存减少,大约100mb。

是否有任何解决方法,我可以遵循的任何路径来增加我的访问2010项目内存限制。

问题流程:我们将登录名和密码放在初始表单中,然后开始打开表单(从表单中获取表单)。当大约10个表单时,acess 2010使用的内存达到107mb,当我们打开下一个表单时,系统崩溃并出现以下错误:“3035说明系统资源已超出”

4 个答案:

答案 0 :(得分:3)

该问题是由32位访问超过每个应用程序的32位Windows虚拟内存限制2GB引起的。我不知道为什么这个问题不会出现在Windows XP上(没时间测试它)。

您可以通过性能监视器或访问应用程序中的代码跟踪VM使用情况。您将看到,随着表单打开,VM使用率逐渐增加,直到访问balks。

解决方案是在Windows 64bit上切换到Access 64位。请记住,如果您有外部dll调用,则需要重写64位。 ActiveX控件也需要64位。


跟踪虚拟机的代码

Declare PtrSafe Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)

Public Type MEMORYSTATUS
   dwLength As Long
   dwMemoryLoad As Long
   dwTotalPhys As Long
   dwAvailPhys As Long
   dwTotalPageFile As Long
   dwAvailPageFile As Long
   dwTotalVirtual As Long
   dwAvailVirtual As Long
End Type

Function ReturnVirtualMemory() As Long

    Dim Mem as MEMORYSTATUS

    Mem.dwLength = Len(Mem)
    GlobalMemoryStatus Mem

    ReturnVirtualMemory = Mem.dwTotalVirtual - Mem.dwAvailVirtual
End Function

答案 1 :(得分:1)

建立Mint提供的虚拟机跟踪代码,我做了一个早期警告'我的应用程序的系统,当VM接近它开始导致问题并建议重新启动时,它会发出警告。这有点令人讨厌,但是直到有人想出一个在64位操作系统环境中运行的32位Office的更好的解决方案,它必须做。

ReturnVM:以GB为单位返回虚拟内存使用量,如果超过1.425GB则触发警报。我发现这适用于我的应用程序,在重新启动之间给予尽可能多的时间,同时仍然允许一些余地在重新启动之前完成工作。随意根据需要进行调整。

os_Restart:写入一个批处理文件,该文件终止活动的Access进程,删除剩余的laccdb文件并重新启动应用程序(提供用户桌面上的所有内容)。写完文件后,它会执行批处理。另一个函数在应用程序启动时删除此文件。

TempVars!tv_WinUID = Environ(" USERNAME")

Function ReturnVM() As Double

    Dim Mem As MEMORYSTATUS
    Dim Result As Integer

    Mem.dwLength = Len(Mem)
    GlobalMemoryStatus Mem

    ReturnVM = Format((Mem.dwTotalVirtual - Mem.dwAvailVirtual) / 1073741824, "0.000")

    Debug.Print ReturnVM & " GB of VM used."

    If (ReturnVM >= 1.425) Then
      DoEvents
      Result = MsgBox("Office Virtual Memory usage is approaching the pre-set limit." & vbCrLf & vbCrLf & "To prevent a possible crash, please click 'OK' to restart immediately." & vbCrLf & vbCrLf & "You may click 'Cancel' to finish what you're working on, but if you do, please restart the application as soon as possible.", vbOKCancel)
      If (Result = vbOK) Then
        os_Restart
      End If
    End If

End Function

Public Function os_Restart()

    Dim fso As Object
    Dim oFile As Object
    Dim BatchContents As String

    Set fso = CreateObject("Scripting.FileSystemObject")

    Set oFile = fso.CreateTextFile("C:\Users\" & TempVars!tv_WinUID & "\Desktop\RestartAccess.bat")

    BatchContents = "@echo Restarting Application..." & vbCrLf & _
                    "@echo off" & vbCrLf & _
                    "taskkill /f /im MSACCESS.EXE" & vbCrLf & _
                    "ping -n 6 127.0.0.1 > nul" & vbCrLf & _
                    "del " & Chr(34) & "C:\Users\" & TempVars!tv_WinUID & "\Desktop\Application.laccdb" & Chr(34) & vbCrLf & _
                    "start " & Chr(34) & Chr(34) & " " & Chr(34) & "C:\Users\" & TempVars!tv_WinUID & "\Desktop\Application.accdb" & Chr(34)

    DoEvents
    'Debug.Print BatchContents
    oFile.WriteLine BatchContents
    oFile.Close
    Set fso = Nothing
    Set oFile = Nothing

    Call Shell("C:\users\" & TempVars!tv_WinUID & "\Desktop\RestartAccess.bat")

End Function

答案 2 :(得分:1)

经过几个月的挫折之后,我在Access 2010和Access 2013中找到了原因和解决方案。在运行程序时在后台加载Skype导致"系统资源超出错误"在大型查询和紧凑和修复期间。

如果在Windows XP兼容模式下运行仍有问题

答案 3 :(得分:1)

这可能对我有所帮助: 在所有驱动器上激活系统管理的分页。 为此,

  1. 右键点击“我的电脑”'图标并选择'属性',
  2. 转到'高级系统设置'>高级>设置>高级>更改
  3. 取消选中'自动管理分页...'并逐个选择所有驱动器并设置“系统管理的大小”#39;为每个人。
  4. 按[确定]即可完成。
  5. Example Screenshot