Reset errori restituiti da DBEngine(0)(0)

di il
2 risposte

Reset errori restituiti da DBEngine(0)(0)

Grazie al suggerimento di By65Franco stò utilizzando il comando DBEngine(0)(0).Execute ma sono incappato in questo problema. Se lancio la sub test, qui sotto riportata, che contiene un errore voluto, nome campo errato, mi viene, giustamente restituito l’errore 3018. Se però correggo la sub e la rilancio mi continua a dare lo stesso errore, ma il reset di Id viene regolarmente eseguito. Sono quindi andato a vedere cosa mi viene restituito da DBEngine.Errors.Count quando rilancio la sub modifica ed il valore non è 0 ma 1, come se la collezione degli errori non venisse resettata ma mantenesse sempre gli errori precedentemente generati.

Per resettare gli errori devo chiudere e riaprire access.

Sub Test1()
On Error GoTo Err_Execute
Dim Strsql As String
Dim errLoop As Error
Debug.Print DBEngine.Errors.Count



Strsql = "ALTER TABLE Tab1 ALTER COLUMN ID COUNTER(1,1)"
DBEngine(0)(0).Execute Strsql, dbFailOnError
Err_Execute:
    If DBEngine.Errors.Count > 1 Then
      For Each errLoop In DBEngine.Errors
            MsgBox "Error number: " & errLoop.Number & vbCr & _
            errLoop.Description
       
        Next errLoop
      
     End If
End Sub

Ringrazio chi mi può dare una mano.

2 Risposte

  • Re: Reset errori restituiti da DBEngine(0)(0)

    Ciao,

    Come nei precedenti Thread si deve sottolineare che DbEngine(0)(0) rappresenta una connessione DAO che viene aperta all'apertura del Database MsAccess e viene chiusa alla chiusura del Database MsAccess.

    • Questa connessione può essere utilizzata in certi contesti e con prudenza
      • per esempio se si modificano le strutture alle tabelle, con gli oggetti QueryDef, etc.. , DbEngine può ancora avere come strutture le precedenti, cioè di quando è stato aperto il database.
      • per esempio se si utilizza per accedere a dei records in lettura e in scrittura, essendo DbEngine una connessione permanentemente aperta, non si avranno particolari problemi ma solo delle performance migliori in quanto l'accesso ai dati risulta più veloce.
      • ma l'argomento è abbastanza vasto, per adesso mi fermerei a queste poche considerazioni ....
    • Questa connessione Dao essendo permanentemente Aperta offre alcuni vantaggi e veniamo al quesito posto :
      • dbFailOnError
        • si utilizza per indicare a DbEngine di ritornare qualsiasi errore anche quando per esempio vengono esequite delle stringhe Sql con all'interno annidate più query Select.
          • per esempio se non viene indicata l'opzione dbFailOnError, DbEngine ritorna il primo errore che si verifica e potrebbe continuare ad esequire sia la Select principale che le Select annidate fino a quando non intercetta un errore.
            • mentre se viene impostata l'opzione dbFailOnError, allora DbEngine ritorna tutti gli errori riscontrati e non esegue nessuna delle query, sia la Select principale sia quelle annidate che sono presenti nella stringa Sql. Si ferma subito e ritorna gli errori.
      • DBEngine.Errors
        • è una collection dove sono riportati tutti gli errori (vediamolo com uno specie storico) che si sono verificati nell'ultima operazione DAO.
          • essendo una connessione permanentemente aperta gli errori DAO che si sono verificati sono sempre presenti nella collection fin quando :
            • o viene chiuso il Database
            • o viene eliminato il contenuto della collection
            • alla richiesta della successiva operazione DAO
        • domanda : sarebbe corretto modificare i contenuti di questa connessione DAO ?
          • io direi di NO in quanto fa parte del motore MsAccess ed è bene che venga gestito automaticamente dal Database senza interferire.
        • domanda : a cosa può servire la collection error di DbEngine ?
          • per approfondire tutti i possibili errori che si sono verificati prima dell'ultimo errore ricevuto
            • quindi consente, per esempio su query complesse e annidate,  di risalire, oltre all'ultimo errore ricevuto , se sono presenti altri errori riscontrabili per quel processo specifico e non solo.
        • domanda : allora come intercettare l'eventuale Errore ?  E se poi si vuole entrare nei dettagli errori precednti ?
          • si utilizza il classico On Error GoTo e si legge il classico Err.Number e Err.Description
            • se poi si vogliono verificare se a monte esistono altri errori, allora si analizza la collection Error di DbEngine per analizzare se l'errore attuale e figlio di altri processi.

    :
    Conclusione:

    • si vuole analizzare gli errori multipli per una connessione ODBC ?  allora leggere la collection DbEngine Error
    • si vuole analizzare gli errori multipli per una stringa Sql che contiene più query annidate ? allora leggere la collection DbEngine Error
    • si vuole costruire un log eventi di errori ? allora leggere lacollection DbEngine Error
    • quando non leggere la collection DbEngine Error ?
      • per query semplici ... Select, Insert, Update, etc...
      • per operazioni semplici su tabelle , fields, etc...
      • per tutti gli altri casi dove le operazioni sono semplici e dirette

    :
    Più o meno penso di aver dato una elementare/semplice analisi 
    Insomma.... me so fatto le domande e me so risposto ... ;-))

    Mi auguro possa aver chiarito qualche concetto utile per te.

  • Re: Reset errori restituiti da DBEngine(0)(0)

    Grazie ByFranco65, appena posso me la studio e ti faccio sapere. Ma già da una prima lettura mi sembra chiara come sempre.

    Ti ringrazio e buona giornata

Devi accedere o registrarti per scrivere nel forum
2 risposte