Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117

    [VB.NET] - DB Access che rimane in uso anche dopo chiusura

    Ragazzi ci sto sbattendo la testa da giorni

    Ho un programma che gestisce vari db access.
    Ogni DB rappresenta un'annualità (esempio il db 2009 contiene tutti i dati riguardanti il 2009)

    Tra le funzioni del programma c'è quella di eliminare le annualità (e quindi il db)

    Per fare questo eseguo queste istruzioni:

    .chiudo la connessione al db da eliminare
    .lo elimino

    usando questo codice:
    codice:
     Do Until Cn.State = ConnectionState.Closed
                        Cn.Close()
                    Loop
    
                    Kill(appPath & "database\" & annoSelezionato & ".mdb")
    Mi capita (solo a volte) che mi restituisca questo errore:

    Il processo non può accedere al file 'D:\Progetti VB.Net\CDL Studio\CDL Studio\bin\Debug\database\2010.mdb' perché è in uso da un altro processo.

    Mi chiedo...se il ciclo DO UNTIL viene soddisfatto (e quindi la connessione è chiusa) come mai il db risulta ancora in uso? :/

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    116
    Mi vengono in mente solo due possibilità:

    1) è in uso da altri programmi che non sono Visual Studio (magari l'hai prima aperto in Access e poi non lo hai chiuso prima di cancellarlo, oppure chiudendolo è rimasto qualcosa di aperto, in tal caso è un problema di Access, non so se da codice si può fare qualcosa)

    2) ad un certo punto della tua logica di programmazione il db contenuto in cn differisce dal db selezionato e contraddistinto dalla variabile annoSelezionato

    Una considerazione:
    Non credo sia necessario il loop until per chiudere la connessione, penso sia sufficiente un if, anche perché credo che, in caso fallisse il comando, genererebbe un'eccezione

  3. #3
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Non credo sia necessario il loop until per chiudere la connessione, penso sia sufficiente un if, anche perché credo che, in caso fallisse il comando, genererebbe un'eccezione
    Hai ragione, ma basta fare un piccolo controllo per risolvere il problema:

    codice:
    If Cn.State <> ConnectionState.Closed Then
           Cn.Close()
    End If
    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Non cambia assolutamente niente, come sintassi è giusta anche il Do...Until che equivale a scrivere:

    codice:
    If Cn.State <> ConnectionState.Closed Then
           Cn.Close()
    End If
    se infatti la connessione è già chiusa salterebbe comunque il loop.
    Sbagliare è umano, perseverare è diabolico.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    116
    Mmh, secondo me a livello di "correttezza formale" è meglio usare altri costrutti.
    Il do.. until viene usato per operazioni che bisogna ripetere n volte, se io sono certo che quell'operazione va fatta una volta sola trovo che ci stia meglio l'if.

    Poi a livello di funzionamento è assolutamente uguale, è solo una questione di forma.

  6. #6
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Mmh, secondo me a livello di "correttezza formale" è meglio usare altri costrutti.
    Il do.. until viene usato per operazioni che bisogna ripetere n volte, se io sono certo che quell'operazione va fatta una volta sola trovo che ci stia meglio l'if.

    Poi a livello di funzionamento è assolutamente uguale, è solo una questione di forma
    Concordo.
    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Si scrive il codice non seguendo delle norme ben precise, a parte la sintassi del linguaggio, ma come è più leggibile secondo il tuo modo di scrivere.

    Dopo tutto anche la variabile Cn non sarebbe corretta seguendo le rigide norme che citate. Forse sarebbe meglio dichiararla come connection o Connection ecc... con una parola che abbia un senso.
    O forse anche:

    codice:
    If Cn.State <> ConnectionState.Closed Then
           Cn.Close()
    End If
    sarebbe meglio allora scriverlo con:

    codice:
    If Cn.State <> ConnectionState.Closed Then  Cn.Close()
    Piccolezze........
    Sbagliare è umano, perseverare è diabolico.

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Il problema potrebbe essere causato dall'Antivirus e/o Firewall del computer.
    Infatti quando è attiva la funzionalità di analisi in tempo reale del file system (e di solito lo è e deve essere così) potrebbe accadere che il file risulti bloccato perchè è in fase di analisi.

    A causa di questo problema a me capitava che la compattazione del db non riusciva e mi ritrovavo magicamente delle nuove copie del DB con nome:
    database1.mdb
    database2.mdb
    database3.mdb

    Anche un disco vecchio, deframmentato, e quindi lento, potrebbe essere la causa di questo ritardo.
    Io darei un'occhiata anche al computer per vedere in che stato è.
    Spesso questi problemi indicano che il computer non è più così efficiente e probabilmente è il caso di riformattare e reinstallare tutto da zero.
    Avevo fatto pure questo, ma poi alla fine questo problema (insieme ad altri problemi) si è ripresentato. Alla fine il cliente si è convinto che era ora di sostituire il vecchio computer con uno nuovo (HP Win64bit, HD500 7200giri,...)

    Dopo di chè, tutti i problemi sono spariti.

    Escludi il file dall'analisi dell'antivirus, eventualmente prova anche a mettere in loop anche la cancellazione del file, intercettando l'errore.

    Infine ricorda che la connessione oltre ad essere chiusa deve anche essere annientata:

    Set CN = Nothing


  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da gibra
    Il problema potrebbe essere causato dall'Antivirus e/o Firewall del computer.
    In effetti......

    Escludi il file dall'analisi dell'antivirus, eventualmente prova anche a mettere in loop anche la cancellazione del file, intercettando l'errore.
    Nooooooooo mi hanno appena detto che nei loop bisogna mettere codice che deve essere eseguito più volte!!!

    Ragazzi scherzo ovviamente.


    Infine ricorda che la connessione oltre ad essere chiusa deve anche essere annientata:
    Set CN = Nothing
    Con questo non mi ritrovo, il file viene cancellato anche senza impostare il C a Nothing ma comunque è corretto farlo.

    Sbagliare è umano, perseverare è diabolico.

  10. #10
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117
    Eccomi qui! Scusate il ritardo!


    Non ho ancora risolto il problema!

    Andiamo per gradi!

    Escludo sia colpa dell'antivirus! La situazione è questa:

    Il mio programma gestisce varie annualità e per ogni nuovo anno viene creato un nuovo db access. Sin qui tutto ok! Creo il nuovo db, mi ci connetto con l'oggetto Cn e così via! Se però provo ad eliminare l'annualità (eliminando il db) mi da errore! Dicendomi che il file è in uso nel processo vshost32.exe il punto è che tutto funziona perfettamente se chiudo il debug e lo rilancio...

    Cioè...se dopo avere aggiunto l'annualità chiudo il programma, lo riapro, ed elimino l'annualità tutto funziona :/
    Credo che il problema sia nella creazione del nuovo db e non nella connessione (perchè passo da un anno all'altro usando sempre il solito oggetto cn, ma aggiornandolo, e non ho problemi).

    La creazione del db altro non è che la copia di un DB access "vergine" che viene copiato nella cartella apposita e rinominato appositamente! Credo che il processo pendende rimanga da li (almeno così me lo spiego visti i sintomi)

    Per copiare il file uso:
    codice:
            'copio il db vergine
            IO.File.Copy(appPath & "\empty\cdlstudio.mdb", appPath & "\database\" & txtNuovoAnno.Text & ".mdb", False)

    Non so che altro dirvi...mi sembra un problema di quelli senza soluzione (proprio perchè se chiudo e riapro il programma funziona tutto)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.