2013-10-23 226 views
2

我的團隊正在使用access 2000,在那裏我們有我們的MDB項目。這個應用程序(ERP)可以打開大約20個訪問表單。在我們決定將整個系統遷移到Access 2010之後,將其轉換爲新格式* .accdb;我們現在有更少的內存,現在大約有100MB。ACCESS 2010系統資源超標

是否有任何解決方法,我可以遵循的任何路徑來增加我的訪問權限2010項目內存限制。

問題流程:我們將登錄名和密碼放在初始表單中,並開始打開表單(從表單中直接獲取表單)。當大約10個表單中,2010年訪問使用的內存達到107MB,並且當我們打開下一個表單時,系統崩潰並出現以下錯誤:「3035說明系統資源超出」

+0

也許你會考慮重新設計的應用程序,所以它並不需要一次打開許多形式。你也可以確定從開放中停止「另外一個表格」實際上運行應用程序。可能你已經打開的一個表單已經佔用了內存。 – HelloW

+0

該應用程序非常複雜,我們不能限制表單的數量,因爲客戶端不想要。我們一直在進行大約一百次的「再一次形式」測試。你是對的,一個打開的表單使用連接內存,發生內存限制問題。 –

+0

我們正在回訪2000年,我們無法解決問題。 –

回答

3

問題是由32位訪問造成的每個應用程序的32位Windows虛擬內存限制爲2GB。我不知道爲什麼這個問題在Windows XP上沒有出現(沒有時間去測試它)。

您可以通過性能監視器或通過訪問應用程序中的代碼來跟蹤VM使用情況。您將看到,隨着表單的打開,虛擬機使用量會逐漸增加,直到訪問虛擬機。

解決方案是在Windows 64位上切換到Access 64位。請記住,如果你有外部DLL調用,他們需要重寫爲64位。另外ActiveX控件需要是64位。


代碼跟蹤VM

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

大廈關閉由造幣廠提供的VM跟蹤代碼,我做了一個排序爲我的應用「預警」系統,警告您當VM正在接近開始導致問題並推薦重新啓動的點。這有點煩人,但直到有人提出了在64位操作系統環境中運行的32位Office的更好解決方案之前,它必須這樣做。

ReturnVM:返回GB中的虛擬內存使用情況,如果超過1.425GB則觸發警報。我發現這適用於我的應用程序,在重新啓動之間給予儘可能多的時間,同時仍然允許一些餘地在重新啓動之前完成工作。隨時根據需要進行調整。

os_Restart:寫入殺死活動的訪問過程中一個批處理文件,刪除剩餘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 
+0

真的很好的做法。 –

1

後無奈的幾個月裏,我已經找到了原因,並在這兩個訪問2010年和2013年訪問該解決方案已經在Skype的加載運行該程序時的後臺在大型查詢和緊湊和修復期間導致「系統資源超出錯誤」。

如果您仍然有在Windows XP兼容模式

1

這可能有助於爲我所做運行問題: 激活系統管理上的所有驅動器分頁。 爲此,

  1. 右擊「我的電腦」圖標,選擇「屬性」,
  2. 進入「高級系統設置」>高級>設置>高級>更改,
  3. 取消選中「自動管理頁面...'並逐個選擇所有驅動器,併爲每個驅動器設置「系統管理大小」。
  4. 按[確定],就完成了。

Example Screenshot