Condividi tramite


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

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

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 su una tabella di grandi dimensioni, è possibile che venga visualizzato il messaggio di errore seguente: spazio su disco o memoria insufficiente per annullare le modifiche apportate ai dati da questa query di azione.

Motivo

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

Questa sezione, metodo o attività contiene passaggi che ti spiegano come modificare il registro. Tuttavia, potrebbero verificarsi gravi problemi se si modifica il registro in modo errato. Pertanto, assicurati che segui questi passaggi con attenzione. Per una maggiore protezione, esegui un backup del registro prima di modificarlo. Quindi, è possibile ripristinare il registro se si verifica un problema. Per ulteriori informazioni su come eseguire il backup e ripristinare il registro, consulta Come eseguire il backup e ripristinare il registro in Windows.

Esistono diversi modi per risolvere questo problema:

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

Metodo 1: Modifica di MaxLocksPerFile nel Registro di sistema

Usare l'editor del Registro di sistema per aumentare il valore maxLocksPerFile sotto la 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

Annotazioni

Il codice di esempio in questo articolo usa oggetti di Microsoft Data Access. Affinché questo codice venga eseguito correttamente, è necessario fare riferimento alla libreria oggetti di Microsoft DAO 3.6. A tale scopo, selezionare Riferimenti dal menu Strumenti in Visual Basic Editor e assicurarsi che la casella di controllo Libreria oggetti di Microsoft DAO 3.6 sia selezionata.

Microsoft fornisce esempi di programmazione solo a scopo illustrativo, senza alcuna garanzia, né espressa né implicita. Ciò include, ma non è limitato, le garanzie implicite di commerciabilità o idoneità per uno scopo specifico. Questo articolo presuppone che tu sia familiarizzato con il linguaggio di programmazione mostrato e con gli strumenti usati per creare e per eseguire il debug delle procedure. I tecnici del supporto Tecnico Microsoft possono aiutare a spiegare le funzionalità di una determinata procedura, ma non modificheranno questi esempi per fornire funzionalità aggiuntive o creare procedure per soddisfare i requisiti specifici. Il SetOption metodo 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 fino alla chiusura dell'oggetto DBEngine.

Annotazioni

Le modifiche apportate a MaxLocksPerFilesetting tramite il SetOption metodo sono disponibili solo tramite la sessione corrente di Oggetti di accesso ai dati . Le query eseguite tramite l'interfaccia utente di Microsoft Access usano ancora 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 una query di azione archiviata causa l'errore, è possibile impostarne la UseTransaction proprietà su No.

Nota: se si esegue questa operazione, non è possibile eseguire il rollback delle modifiche se si verifica un problema o un errore durante l'esecuzione della query.

  1. Aprire la query nella visualizzazione Struttura.
  2. Scegliere Proprietà dal menu Visualizza.
  3. Selezionare 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. Salva la query e chiudila.

Maggiori informazioni

Nel 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 in eccesso rispetto al valore MaxLocksPerFile, la transazione viene suddivisa in due o più parti e parzialmente sottoposte a commit.

Procedura per riprodurre il problema

Nell'esempio seguente viene utilizzata una routine di Visual Basic per creare una tabella con 10.000 record al suo interno e quindi modifica la tabella per causare il messaggio di errore:

  1. Apri il database di esempio Northwind.mdb.
  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 procedura, 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 nella visualizzazione Struttura.

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

  5. Salva la tabella. Fare clic su Sì quando viene richiesto che alcuni dati potrebbero andare persi.

    Si noti che, dopo un po' di tempo, 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.