Errore "Spazio su disco o memoria insufficiente" quando si esegue un'operazione su una tabella di Access

Avanzate: richiede competenze esperte di codifica, interoperabilità e multiutente.

Questo articolo si applica solo a un database di Microsoft Access (.mdb).

Sintomi

Quando si esegue un'operazione su una tabella, è possibile che venga visualizzato il messaggio di errore seguente se l'operazione crea un numero elevato di blocchi di pagina: spazio su disco o memoria insufficiente.

Se si esegue una query di azione in una tabella di grandi dimensioni, è possibile che venga visualizzato il messaggio di errore seguente: Spazio su disco o memoria sufficiente per annullare le modifiche ai dati che questa query di azione sta per apportare.

Causa

I blocchi di pagina necessari per la transazione superano il valore MaxLocksPerFile, che per impostazione predefinita è 9500 blocchi. MaxLocksPerFilesetting viene archiviato nel Registro di sistema di Windows.

Risoluzione

Importante

In questa sezione, metodo o attività viene illustrata la procedura per modificare il Registro di sistema. Poiché l'errata modifica del Registro di sistema può causare seri problemi, Di conseguenza, attenersi scrupolosamente alla procedura indicata. Per una maggiore protezione, eseguire il backup del Registro di sistema prima di modificarlo. In questo modo sarà possibile ripristinare il Registro di sistema se si verifica un problema. Per ulteriori informazioni sull'esecuzione del backup e del ripristino del Registro di sistema, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:

322756 Come eseguire il backup e il ripristino del Registro di sistema in Windows

Esistono diversi modi per risolvere questo problema:

  • È possibile usare Regedit.exe per modificare il Registro di sistema e modificare il valore MaxLocksPerFile in modo permanente.
  • È possibile utilizzare il metodo SetOption dell'oggetto DBEngine per modificare temporaneamente il valore MaxLocksPerFile nel codice.
  • Se si verifica l'errore quando si esegue una query di azione, è possibile modificare la query e impostarne la proprietà UseTransaction su No.

Metodo 1: Modifica di MaxLocksPerFile nel Registro di sistema

Usare Editor del Registro di sistema per aumentare il valore MaxLocksPerFile nella chiave seguente:

Per Microsoft Access 2000, in Microsoft Access 2002 e in Microsoft Office Access 2003 in esecuzione in un sistema operativo Windows a 32 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0

Per Microsoft Access 2000, in Microsoft Access 2002 e in Microsoft Office Access 2003 in esecuzione in un sistema operativo Windows a 64 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Jet 4.0

Per Microsoft Office Access 2007 in esecuzione in un sistema operativo Windows a 32 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE

Per Microsoft Office Access 2007 in esecuzione in un sistema operativo Windows a 64 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Access Connectivity Engine\Engines\ACE

Per Microsoft Access 2010 in esecuzione in un sistema operativo Windows a 32 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE

Per Microsoft Office Access 2010 in esecuzione in un sistema operativo Windows a 64 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ACE

Per Microsoft Access 2013 in esecuzione in un sistema operativo Windows a 32 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE

Per Microsoft Office Access 2013 in esecuzione in un sistema operativo Windows a 64 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Access Connectivity Engine\Engines\ACE

Per Microsoft Access 2016 in esecuzione in un sistema operativo Windows a 32 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE

Per Microsoft Office Access 2016 in esecuzione in un sistema operativo Windows a 64 bit:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Access Connectivity Engine\Engines\ACE

Si noti che questo metodo modifica l'impostazione del Registro di sistema per tutte le applicazioni che usano il motore di database Microsoft Jet versione 4.0.

Metodo 2: Uso di SetOption per modificare temporaneamente MaxLocksPerFile

Nota

Il codice di esempio in questo articolo usa oggetti di Microsoft Data Access. Per l'esecuzione corretta di questo codice, è necessario fare riferimento alla libreria di oggetti Microsoft DAO 3.6. A tale scopo, fare clic su Riferimenti nel menu Strumenti in Visual Basic Editor e verificare che la casella di controllo Libreria oggetti di Microsoft DAO 3.6 sia selezionata.

Microsoft fornisce esempi di programmazione a scopo puramente illustrativo, senza alcuna garanzia di qualsiasi tipo, sia espressa che implicita, ivi incluse, senza limitazioni, le garanzie implicite di commerciabilità o idoneità per uno scopo particolare. In questo articolo si presuppone che l'utente conosca il linguaggio di programmazione in questione e gli strumenti utilizzati per creare ed eseguire il debug delle procedure. Gli esperti Microsoft sono autorizzati a fornire spiegazioni in merito alla funzionalità di una particolare routine, ma in nessun caso a modificare questi esempi per fornire funzionalità aggiuntive o a creare routine atte a soddisfare specifiche esigenze. Il metodo SetOption esegue temporaneamente l'override dei valori per le chiavi del motore di database Microsoft Jet nel Registro di sistema. Il nuovo valore rimane attivo fino a quando non viene modificato di nuovo o finché l'oggetto DBEngine non viene chiuso.

Nota

Le modifiche apportate a MaxLocksPerFilesetting tramite il metodo SetOption saranno disponibili solo tramite la sessione corrente di Data Access Objects (DAO). Le query eseguite tramite l'interfaccia utente di Microsoft Access useranno comunque le impostazioni nel Registro di sistema.

L'esempio di codice seguente imposta MaxLocksPerFile su 200.000 prima di eseguire un'operazione di aggiornamento all'interno di una transazione:

Sub LargeUpdate()
   On Error GoTo LargeUpdate_Error
   Dim db As DAO.Database, ws As DAO.Workspace

' Set MaxLocksPerFile.
   DBEngine.SetOption dbMaxLocksPerFile, 200000

Set db = CurrentDb
   Set ws = Workspaces(0)

' Perform the update.
   ws.BeginTrans
   db.Execute "UPDATE BigTable SET Field1 = 'Updated Field'", _
         dbFailOnError

ws.CommitTrans

db.Close
   MsgBox "Done!"
   Exit Sub

LargeUpdate_Error:
   MsgBox Err & " " & Error
   ws.Rollback
   MsgBox "Operation Failed - Update Canceled"
   End Sub

Metodo 3: impostazione della proprietà UseTransaction in una query di azione

Se l'errore è causato da una query di azione archiviata, è possibile impostare la relativa proprietà UseTransaction su No. Si noti che in questo caso, non è possibile eseguire il rollback delle modifiche se si verifica un problema o un errore durante l'esecuzione della query:

  1. Aprire la query in visualizzazione Struttura.
  2. Scegliere Proprietà dal menu Visualizza.
  3. Fare clic su uno spazio vuoto nella metà superiore della finestra di query per visualizzare la finestra di dialogo Proprietà query.
  4. Impostare la proprietà UseTransaction su No.
  5. Salvare la query e chiuderla.

Ulteriori informazioni

MaxLocksPerFilesetting nel Registro di sistema impedisce alle transazioni nel motore di database Microsoft Jet di superare un valore specificato. Se una transazione tenta di creare blocchi superiori al valore MaxLocksPerFile, la transazione viene suddivisa in due o più parti e con commit parziale.

Procedura per riprodurre il problema

Nell'esempio seguente viene utilizzata una routine di Visual Basic per creare una tabella contenente 10.000 record e quindi viene modificata la tabella per generare il messaggio di errore:

  1. Aprire il Northwind.mdb di database di esempio.
  2. Creare un modulo e quindi digitare la procedura seguente:
Sub CreateBigTable()
   Dim db As Database, rs As Recordset
   Dim iCounter As Integer, strChar As String
   Set db = CurrentDb
   db.Execute "CREATE TABLE BigTable (ID LONG, Field1 TEXT(255), " & _
     "Field2 TEXT(255), Field3 TEXT(255), Field4 TEXT(255))", _
     dbFailOnError
   Set rs = db.OpenRecordset("BigTable", dbOpenDynaset)
   iCounter = 0
   strChar = String(255, " ")
   While iCounter <= 10000
      rs.AddNew
      rs!ID = iCounter
      rs!Field1 = strChar
      rs!Field2 = strChar
      rs!Field3 = strChar
      rs!Field4 = strChar
      rs.Update
      iCounter = iCounter + 1
   Wend
   MsgBox "Done!"
End Sub

  1. Per eseguire la routine, digitare la riga seguente nella finestra Immediata e quindi premere INVIO:

    CreateBigTable
    

    La procedura crea una tabella denominata BigTable con 10.000 record.

  2. Salvare il modulo come Module1 e quindi chiuderlo.

  3. Aprire la tabella BigTable in visualizzazione Progettazione.

  4. Modificare la proprietà FieldSize di Field4 su 253.

  5. Salvare la tabella. Fare clic su Sì quando viene richiesto che alcuni dati vadano persi.

    Si noti che, dopo un po', vengono visualizzati i messaggi di errore seguenti:

    Microsoft Access can't change the data type.
    There isn't enough disk space or memory.  
    
    Errors were encountered during the save operation. Data types were not changed. Properties were not updated.