Newsgroup: it.comp.lang.visual-basic
Titolo: Cambio database ADO

Ho un project composto da diverse form con n-mila controlli agganciati ad un
database.
Ora ho la necessita' di cambiare run-time il database a cui sono agganciati
questi controlli con uno di identica struttura ma che si trova in  un'altra
directory.
Qualcuno mi puo' dire come posso fare?
Mi sapete dire anche come posso compattare il database? (anche in questo
caso sembra sia necessario scollegare il database dai controlli)
Uso VB6 SP3 + ADO2.1
Grazie

...


Allora:
1) se vuoi VERAMENTE rendere configurabile il tuo accesso a DB,
scordati la compattazione, che e' una cosa che non puoi fare con DBMS
seri (SQL Server, Ingres o Oracle, per capirci)
2) per il resto... bel problema.... anche perche', se ho capito bene,
c'e' un problema di disegno della tua applicazione, ovvero hai
indirizzato i vari data controls a utilizzare UNA SPECIFICA base dati
Access.... L'unica, a mio avviso, e' fare un po' di lavoro in questo
senso: tira via i riferimenti al database nei data controls, creati
oggetti connection e recordset opportuni, quindi agganciali
opportunamente ai vari data controls a run time.
Ciao!
Luca Menegotto


seri (SQL Server, Ingres o Oracle, per capirci)
RGZPFM su Db2/400 (pero' e' di sistema operativo). Piu' serio di questo...
Fabio Pagano

seri (SQL Server, Ingres o Oracle, per capirci)





scritte... :(((
Lo stesso dicasi per SQL7, che non supporta campi chiamati, ad esempio,
"FoR" cosa che Access supporta.
Il grosso problema e' quello del minimo comune denominatore dei vari
database, cioe' usare solo le funzioni supportate da tutti (il che mi sembra
quasi utopistico).
Buon lavoro.
Fabio Pagano


 DAO......
Per quanto riguarda i problemi di performance posso darti i seguenti
consigli:
1) Rinuncia ai controlli data e associa i campi a mano (Set
mioControllo.DataSource = mioRsAdo)
2) In alternativa a 1): lascia i controlli data ma rimuovi dagli stessi
l'associazione al database, all'avvio dell'applicazione apri un'unica
connection, apri i recordset che ti servono solo quando effettivamente ti
servono e associali ai controlli data relativi
3) Se usi ADO superiore a 2.0, passa al formato di Office 2000.
Ho visto che in qualche messaggio precedente ti dicevano di lasciar perdere
la compattazione; non sono per niente d'accordo.
In Access, soprattutto nel 2000, c'è un consumo di spazio enorme e la
compattazione è spesso molto utile; inoltre, sempre nel 2000, non fare la
compattazione vuol dire non poter fare nemmeno il rirpistino. Poichè Access
non è un server di Database che, basandosi sulla scrittura di Log, possa
ripristinare uno stato valido anche a seguito di errori critici (a
differenza di SQL Server e di altri server di DataBase "veri"), la procedura
di ripristino è assolutamente necessaria.
Per poter compattare un database con ADO devi usare ADO 2.1, il provider per
Jet 4.0 ed un database in formato Access 2000.
Il database deve essere aperto in modalità esclusiva (è così anche in DAO e
nello stesso Access), quindi non solo devi chiudere tutte le altre
connessioni utilizzate dalla tua applicazione, ma non ci deve essere nemmeno
nessun altro collegato in rete che sta utilizzando il database.
Il metodo CompactDatabase di ADO 2.1 esegue il ripristino oltre che la
compattazione (come detto, in Access 2000 ripristino e compattazione sono
un'operazione unica).
Qui sotto c'è un esempio di codice funzionante.
Private Sub CompattaPippo()
'Compatta e ripara il file c:\pippo.mdb
'cnAdo è un oggetto Connection ADO che apro in un modulo BAS
'e che uso in tutta l'applicazione
'la proprietà cnAdo.ConnectionString deve essere già settata
'cnAdo deve essere chiusa perchè l'operazione di compattazione
'deve aprire una Connection esclusiva
Dim je As New JRO.JetEngine
Principale.MousePointer = vbHourglass
On Error GoTo Errore
If cnAdo.State = adStateOpen Then cnAdo.Close
je.CompactDatabase cnAdo, "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=c:\pippo2.mdb;"
Kill "c:\pippo.mdb"
Name "c:\pippo2.mdb" As "pippo.mdb"
cnAdo.Open
Principale.MousePointer = vbNormal
MsgBox "Compattazione e ripristino dell'archivio eseguiti correttamente",
vbInformation, "Procedura terminata"
Exit Sub
Errore:
Dim AdoErrore As ADODB.Error, strErroreTemp As String
Principale.MousePointer = vbNormal
strErroreTemp = "Errore N." & Err.Number & vbCrLf & Err.Description
For Each AdoErrore In cnAdo.Errors
    strErroreTemp = strErroreTemp & vbCrLf & vbCrLf & AdoErrore.Number & " -
" & AdoErrore.Description
Next
MsgBox strErroreTemp, vbCritical, "Errore!"
If cnAdo.State = adStateClosed Then
    cnAdo.Open
Else
    cnAdo.Close
    cnAdo.Open
End If
End Sub
Ciao e buon lavoro
   <--< Nik >-->

Grazie Mille e a buon rendere!!!!!
Andrea