Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
- Aprire la query nella visualizzazione Struttura.
- Scegliere Proprietà dal menu Visualizza.
- Selezionare uno spazio vuoto nella metà superiore della finestra di query per visualizzare la finestra di dialogo Proprietà Query.
- Impostare la proprietà UseTransaction su No.
- 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:
- Apri il database di esempio Northwind.mdb.
- 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
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.
Salvare il modulo come Module1 e quindi chiuderlo.
Aprire la tabella BigTable nella visualizzazione Struttura.
Modificare la proprietà FieldSize di Field4 su 253.
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.