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.