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

    VB.Net Ancora sui File.mdb di Access2000 che non si chudono

    Comincio ammettendo le mie carenze:
    - provengo da VB6 che conosco non tanto quanto vorrei
    - sto faticosamente cercando di convertire in VB.Net un mio programma
    - nel programma importo dati tramite un driver ODBC e li uso per popolare Tabelle di Access 2000
    - l’import dei dati e il successivo popolamento delle Tabelle avviene in questa forma:

    codice:
        Public Sub ImportTipologie()
    
            Dim rsTipologie As New ADODB.Recordset()
            Dim rsPicam As New ADODB.Recordset()
            Dim sSQLPicam As String, sSQLAccess As String
    
            sSQLPicam = "SELECT Count(tip_cli_for) From Tipol"
            rsPicam.Open(sSQLPicam, CnPicam, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
            ' Per informazione CnPicam = "DSN=PicamDev;DBQ=S:\Picam7\ARC\S00;CODEPAGE=1252" - Questa è la connessione al file ODBC
    
            PB = rsPicam(0).Value
            ProgressBarImport.Maximum = PB
    
            rsPicam.Close()
            rsPicam = Nothing
    
            rsPicam = New ADODB.Recordset()
    
            sSQLPicam = "SELECT tip_cli_for, tip_cod, tip_des FROM Tipol"
            rsPicam.Open(sSQLPicam, CnPicam, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    
            sSQLAccess = "DELETE Tipologie.* FROM Tipologie"
            rsTipologie.Open(sSQLAccess, CnDBserver, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
            ' Per informazione CnDBserver="Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=S:\ArchivioAccess.mdb"
    
            sSQLAccess = "SELECT Cli_Fo, CodTp, Tipologia FROM Tipologie"
            rsTipologie.Open(sSQLAccess, CnDBserver, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    
            rsPicam.MoveFirst()
    
            Do Until rsPicam.EOF
                ProgressBarImport.PerformStep()
                rsTipologie.AddNew()
                rsTipologie("Cli_Fo").Value = Trim(rsPicam("tip_cli_for").Value)
                rsTipologie("CodTp").Value = Trim(rsPicam("tip_cod").Value)
                rsTipologie("Tipologia").Value = Trim(rsPicam("tip_des").Value)
                rsTipologie.Update()
                rsPicam.MoveNext()
                Application.DoEvents()
            Loop
    
            If rsPicam.State <> ConnectionState.Closed Then
                rsPicam.Close()
                rsPicam.ActiveConnection = Nothing
                Application.DoEvents()
            End If
    
            If rsTipologie.State <> ConnectionState.Closed Then
                rsTipologie.Close()
                rsTipologie.ActiveConnection = Nothing
                Application.DoEvents()
            End If
    
        End Sub

    Sono conscio del fatto che il sistema che uso è magari un poco obsoleto, ma è più o meno quello che facevo in VB6 dove funzionava alla grande.
    Siccome il grande numero di dati gestito determina una notevole espansione del DB, ho la necessità di compattarlo.
    Ovviamente con l’accesso alle Tabelle si “apre” i DB di Access con conseguente creazione di un File.ldb
    Qui nasce il problema, perché qualche tabella non riesce a chiudersi e di conseguenza anche il DB rimane aperto e la compattazione non può avvenire.
    Tra parentesi, ho notato che le Tabelle più ostiche da chiudere sono quelle che istanzio con le Query di Eliminazione.
    Ho provato anche in questo modo:
    codice:
     Public Function ChiudiDB(PathDB As String)
    
            Dim Connessione As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=S:\" & PathDB)
            Connessione.Open()
            If Connessione.State <> ConnectionState.Closed Then
                Connessione.Close()
                Application.DoEvents()
            End If
    
            ChiudiDB = 0
    
        End Function
    istanziando la procedura appena prima della compattazione, ma non c’è verso, se il DB è aperto ed è presente il File.ldb non c’è niente da fare, non si chiude.
    Sono convinto che i maestri mi diranno di ricominciare a studiare tutto dall’inizio (e io ci sto provando, sui testi di Balena!!) ma se ci fosse una soluzione drastica per chiudere un DB di Access 2000 aperto, sarei decisamente più contento (non ditemi di chiudere la Form!!)
    Per pura informazione, sto importando Dati da una versione del programma di contabilità Picam (Olidata) piuttosto datata.
    Qualcuno mi può aiutare?
    Ovviamente accetto ogni critica e sono pronto a cospargermi il capo di cenere ma abbiate pazienza, oltre che neofita di VB.Net sono anche "anziano": a febbraio sono 70 e l'età non aiuta.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dove chiudi la connessione CnPicam ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    L'unica chiusura che sono riuscito a fare per Picam (ODBC) è impostando Picam.Close() e quindi rsPicam.ActiveConnection = Nothing al termine di ogni Sub di importazione dei Dati.
    Però, per quello che ho potuto vedere, l'accesso al DB che contiene i dati di Picam non provoca anomalie; non si tratta di un File .mdb. Sono solo i File di Access 2000 che, quando li apri generano un File.ldb: questo file indica che stai operando nel DB. In molti casi basta una semplice istruzione Recordset.close e Recordset = Nothing per chiudere il DB, mentre in altri casi non serve. Dire in quali casi non è facile perché di fatto eseguo sempre le stesse operazioni. La sola cosa che ho realmente notato è che se apro una Query di Eliminazione, poi è davvero impossibile chiudere il DB. L'unico modo che ho trovato per farlo è aprire subito dopo una nuova Query di Selezione che semplicemente acceda alla tabella sulla quale prima ho fatto l'eliminazione e poi, con la sola istruzione Recordset.close e poi Recordset = Nothing, il DB si chiude (ma non sempre,...).
    codice:
            sSQLAccess = "DELETE Tipologie.* FROM Tipologie"
            rsTipologie.Open(sSQLAccess, CnDBserver, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    
    ' Qui le istruzioni sSQLAccess.close e sSQLAccess = Nothing non servono a chiudere il DB
    ' Devo aggiungere una nuova Query di selezione per poterlo chiudere, sempre con le stesse istruzioni, ovviamente
    
            sSQLAccess = "SELECT Cli_Fo, CodTp, Tipologia FROM Tipologie"
            rsTipologie.Open(sSQLAccess, CnDBserver, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
                rsTipologie.Close()
                rsTipologie = Nothing
    
    ' Così si chiude
    Bello vero?

  4. #4
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Per Oregon, ma anche per chiunque sia interessato,.... Io ho indicato il modo nel quale riesco a chiudere il DB, ma si tratta evidentemente di un "accrocchio" poco ortodosso. Non so se Microsoft lo consideri normale, a me non pare. Quello che mi piacerebbe sapere è se esiste un modo più radicale (intendo una istruzione, magari) per chiudere un DB di Access (2000 in questo caso).
    Oppure, qualcuno potrebbe spiegarmi perché nel modo che ho indicato si chiude e diversamente no? Io non ne capisco le ragioni.
    Spero ancora che qualcuno abbia la risposta.

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Fino a che non chiudi la connessione, il db resterà sempre aperto.

  6. #6
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Questo è assolutamente vero però, siccome io non apro la connessione in modo esplicito, ma contestualmente all'esecuzione della Query,

    codice:
    recordset.Open(sSQL, Cnn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    ho ritenuto corretto chiudere solo il recordset: in qualche caso funziona in altri, come illustrato, no.
    Comunque ho anche provato ad inserire quanto segue al termine delle procedure, ma non serve se prima non si chiude il Recordset:
    codice:
        Public Function ChiudiDB(PathDB As String)
    
            Dim Connessione As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=S:\Arc\" & PathDB)
            Connessione.Open()
            If Connessione.State <> ConnectionState.Closed Then
                Connessione.Close()
                Application.DoEvents()
            End If
    
            ChiudiDB = 0
    
        End Function

    o almeno, io non sono riuscito a trovare chiuso il DB.
    Sicuramente sbaglio qualcosa, ma non so proprio cosa.

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Francamente, il tuo approccio è completamente sbagliato.
    Parli di connessione implicita, ma è un qualcosa che non esiste, perché non ha alcun senso questa affermazione.

    La regola è:
    1. apro connessione
    2. apro recordset
    3. chiudo recordset
    4. chiudo connessione

    Qualsiasi altro modo di procedere è sbagliato, non è un opinione ma un fatto certo su cui non c'è alcun dubbio.

  8. #8
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Perdona la mia ignoranza.
    Ritengo assolutamente corretto quello che affermi, però per cortesia spiegami per quale ragione io apro la connessione con la stringa
    codice:
    recordset.Open(sSQL,Cnn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)
    
    nella quale c'è solo l'istruzione "recordset.open" e nessuna istruzione di apertura della connection?
    Per conseguenza non saprei proprio come chiudere una connessione che non ho mai aperto (e di fatto non l'ho mai fatto!!).
    Sono piuttosto confuso: al mio posto tu come avresti eseguito la Query?
    Grazie in anticipo.

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.