Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263

    [VB. NET] Errore solo se eseguo la procedura da Rete diversa.

    So benissimo che il Titolo non esplicita quello che dirò, ma non ho trovato altre possibili spiegazioni.
    La procedura che sto scrivendo, prevede che un DB di Access 2007 sia residente su di un Server di Rete (il Server si chiama S:\) e che, in determinate situazioni, questo DB venga compattato e poi copiato in una cartella sulle Root dei diversi utilizzatori. Funziona benissimo.
    Quando però provo a farlo funzionare sul mio PC di casa, che ovviamente non è una Rete, sono costretto a simulare la Rete stessa; ho partizionato l'HD e una delle partizioni l'ho chiamata, appunto S:\. Anche sul PC di casa funziona tutto, tranne quando chiedo di compattare il DB. Per qualche ragione che non riesco a identificare, la Sub che esegue la compattazione mi dice che un DB è già aperto. Devo ancora specificare che questa anomalia si verifica SOLO se lancio il programma dall'eseguibile, mentre se lo lancio da Visual Studio (in Debug o in Release) l'errore non si presenta.
    Questo mi impedisce di fare le necessarie verifiche.
    La mia impressione è che, non dovendo il sistema accedere al Server reale, la procedura si svolga troppo rapidamente, ma non ho certezze.
    Allego il Codice per il quale viene segnalato l'errore:

    codice:
        Public Sub CompattaDB()
            Try
    
                If File.Exists(dbTemporaneo) Then
                    Kill(dbTemporaneo)
                End If
    
                Dim Conn As New OleDb.OleDbConnection(CnDBServer)
                If Conn.State <> ConnectionState.Closed Then
                    Conn.Close()
                    Conn = Nothing
                End If
    
                Thread.Sleep(1000)
    
                LblAvviaImp.Text = "Compattazione dei Files"
                Application.DoEvents()
    
                Dim MioEngine As New Microsoft.Office.Interop.Access.Dao.DBEngine
                Dim DbScr As String = DB_Server
                Dim DbDes As String = dbTemporaneo
                MioEngine.CompactDatabase(DbScr, DbDes)
    
                If Conn.State <> ConnectionState.Closed Then
                    Conn.Close()
                    Conn = Nothing
                End If
    
                Dim ConnT As New OleDb.OleDbConnection(cnStrAccess & dbTemporaneo)
                If ConnT.State <> ConnectionState.Closed Then
                    ConnT.Close()
                    ConnT = Nothing
                End If
    
                Thread.Sleep(1000)
    
                File.Copy(dbTemporaneo, DB_Server, overwrite:=True)
    
            Catch ex As Exception
                MsgBox("Errore durante il tentativo di compattazione del database nella Sub ''CompattaDB'': " & ex.Message)
    
                If File.Exists(dbCopiaBackup) Then
                    File.Copy(dbCopiaBackup, DB_Server, overwrite:=True)
                End If
            End Try
        End Sub

    Come potete vedere ci ho messo di tutto e di più per chiudere i DB e per rallentare l'esecuzione, ma senza risultato. Non è che mi preoccupi più di tanto visto che non devo usarlo a casa, però mi piacerebbe capire come fare per evitare l'errore, perché pur sempre di errore si tratta. Non vorrei, ad esempio, che se un giorno arrivassero PC molto più performanti il problema si presentasse.
    Grazie in anticipo a chi vorrà aiutarmi.

  2. #2
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,254
    Esattamente che errore ti restituisce?
    Non mi sembra un problema di "velocità", dalla descrizione voterei per un problema di permessi.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Probabilmente è l'antivirus. Prova a disabilitarlo temporaneamente per capire se è la causa.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Non ho ancora potuto fare una ulteriore verifica sul PC di casa, ma posso anticiparvi che su quello della ditta, che sta nella Rete con server S:\ l'eseguibile NON da errori nonostante l'antivirus attivo. Aggiungo che l'antivirus è lo stesso che utilizzo nel PC di casa.
    Farò comunque la verifica al più presto.
    Saluti.

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Come primo suggerimento, io tenderei a semplificare il codice togliendo tutte le parti inutili.

    Per fare un esempio, a che servono questi blocchi?
    codice:
    Dim Conn As New OleDb.OleDbConnection(CnDBServer)
    If Conn.State <> ConnectionState.Closed Then
      Conn.Close()
      Conn = Nothing
    End If
    Non ha senso creare un oggetto Connection e poi testare se è chiuso: quando viene creata, una connessione è sempre chiusa, a meno di non aprirla con Open, quindi il controllo è del tutto superfluo.

    Eliminare tutte le istruzioni inutili sicuramente è un aiuto all'individuazione della parte in cui si verifica il problema, e quindi giungere alla sua soluzione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Ho fatto quanto segue:
    - ho riportato lo script alla versione iniziale nella quale non c'erano tentativi di rallentare l'esecuzione.

    codice:
    Public Sub CompattaDB()
            Try
    
                If File.Exists(dbTemporaneo) Then
                    Kill(dbTemporaneo)
                End If
    
                LblAvviaImp.Text = "Compattazione dei Files"
                Application.DoEvents()
    
                Dim MioEngine As New Microsoft.Office.Interop.Access.Dao.DBEngine
                Dim DbScr As String = DB_Server
                Dim DbDes As String = dbTemporaneo
                MioEngine.CompactDatabase(DbScr, DbDes)
    
                File.Copy(dbTemporaneo, DB_Server, overwrite:=True)
    
            Catch ex As Exception
                MsgBox("Errore durante il tentativo di compattazione del database nella Sub ''CompattaDB'': " & ex.Message)
                RisComp = 0
                If File.Exists(dbCopiaBackup) Then
                    File.Copy(dbCopiaBackup, DB_Server, overwrite:=True)
                End If
            End Try
        End Sub

    - ho arrestato l'Antivirus (Windows defender, l'unico installato).
    - ho generato l'eseguibile.
    Il risultato è sempre lo stesso e l'errore che il sistema mi comunica è il seguente: "Si è cercato di aprire un database già aperto dall'utente "admin" nel computer "PC-CASA". Riprovare quando il database sarà disponibile."

  7. #7
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Scusate per la mia assenza di questi giorni: il lavoro.
    Ho fatto un nuovo esperimento. Ho installato un ulteriore HD al quale ho attribuito il nome S:\ ossia lo stesso nome precedentemente attribuito alla partizione che prendeva il posto del Server.
    Ebbene: nessun errore!!!
    Se torno a dare il nome S:\ alla partizione dell'HD principale, eccol'Errore!!
    Io non me lo so spiegare.
    Ma sicuramente tutto è legato alla localizzazione fisica del drive S:\
    Aspetto considerazioni.
    Saluti.-

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 © 2024 vBulletin Solutions, Inc. All rights reserved.