Access – errori di record-locking

Anche se si impostano le Opzioni prededefinite di Access (2007) con un valore che sembra corretto per gestire i problemi di record-locking del proprio progetto, probabilmente con un numero elevato di utenti si verificheranno comunque conflitti di varia natura.

Più utenti usano l’applicazione, più probabile che si creino conflitti. Tali conflitti possono comunque essere gestiti (catturati) tramite codice VBA e comunicati agli utenti.

Microsoft con Access 2007 e successivi, ha sviluppato un modo per memorizzare dati nella cache, scrivendoli sul disco solo quando la cache è piena. Questo rende Access più veloce ma rende più difficile l’intercettazione degli errori.

Un altro  problema con il salvataggio dei dati nella cache è che, solo quando la cache è piena i dati verranno scritti sul disco e saranno solo in questo caso disponibili agli altri utenti.

Per risolvere questi problemi bisogna usare nelle procedure transazioni con Workspace.BeginTrans e Workspace.CommitTrans. (Transazioni gestite dall’oggetto Connection di ADO)

Bisogna garantire una gestione degli errori efficente.

I codici di errore  che più spesso si trovano in questi casi sono

3260 (non è possibile aggiornare i dati)

3186 (non è possibile salvare i dati sul disco)

3197 (più istanze dello stesso database aperte sulla stessa macchina)

3188 (due o più utenti stanno tentando di modificare gli stessi dati

 

La funzione GestError permette la gestione degli errori con una solo funzione pubblica

 

Public Function GestError(vValue As Integer) As Integer

Dim lCounter As Long

Dim lReturn As Long

Dim sCaption As String

Dim sMessage As String

sCaption = “gestione Errori”

Select Case Err.Number

Case 3021

‘ Lascia passare l’errore

Case 3186

‘ Record è bloccato da un’altra macchina

If vValue < 10 Then

For lCounter = 0 To 15000

Next lCounter

GestError = 3

Else

ParseError Err, Error

GestError = 4

End If

Case 3188

‘ Record è bloccato da un’altra sessione dell’applicativo sulla stessa machina

MsgBox “Il record non può essere bloccato in quanto in uso in questa macchina”

Case 3197

sMessage = “Il record che si stà salvando è stato modificato da un altro utente” _

& ” vuoi modificarlo ugualmente?”

lReturn = MsgBox(sMessage, vbYesNo, sCaption)

Select Case lReturn

Case vbYes

GestError = 3

Case vbNo

GestError = 4

End Select

Case 3260

‘ Il record è bloccato da un’altra macchina

If vValue < 10 Then

For lCounter = 0 To 15000

Next lCounter

GestError = 3

Else

ParseError Err, Error

GestError = 4

End If

Case 3421

sMessage = “Inserimento cancellato a causa di un errore di conversione”

lReturn = MsgBox(sMessage, vbOKOnly, sCaption)

Case Else

sMessage = “Il codice di errore è:  ” & Err

lReturn = MsgBox(sMessage, vbInformation, sCaption)

End Select

End Function

 

GestError accetta un singolo argomento (Flag – intero) sulla base del quale prende provvedimenti e visualizza messaggi.

Errore 3260: record non aggiornabile in quanto bloccato da un’altra macchina. Questo errore si verifica quando è abilitato il blocco pessimistico dei record. Accade quando un utente prova a modificare un record e questo viene bloccato fino al termine e salvataggio del record.

Valori possibili di LockType:

adLockBatchOptimistic (valore obbligatorio per gli aggiornamenti batch)

adLockOptimistic (blocco ottimistico dei record, applicato solo con il metodo UPDATE)

adLockPessimistic (blocco pessimistico dei record, applicato non appena si inizia la modifica di un record)

adLockReadOnly (solo lettura, non sono accettate modifiche)

asLockUnspecified (nessun tipo di blocco specificato)

Errore 3186: simile all’errore 3160 ma dice solamente che è stato impossibile salvare il record.

Errore 3188: si verifica quando si ha più di un’istanza del database aperta sulla stessa macchina e si cerca di modificare (bloccare) un record in entrambe le sessioni. La soluzione è non aprire più di un’istanza dello stesso DB nella medesima macchina.

Errore 3197: questo errore può essere causa di confusione. Esso normalmente si verifica quando in un’applicazione è attivo il Locking ottimistico o misto. Bisogna gestire questo tipo di errore anche perchè potrebbe verificarsi un blocco dell’elaborazione dei dati da parte di Access. Probabilmete più utenti stanno tentando di modificare lo stesso record o blocco di record.

Emilio Scaccaglia (emilio.scaccaglia@alice.it)

Informazioni su scaccaglia

Sviluppo software nei linguaggi: Visual Basic, Visual C e Java. Mi occupo anche di trasferimento dati in reti LAN o WAN. Creazione software a misura del cliente. Access - Microsoft SQL Server - Word - Excel.

Pubblicato il 22 giugno 2011 su Access & SQL, Access e Visual Basic, Codice VBA, Progetti Access. Aggiungi ai preferiti il collegamento . Lascia un commento.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: