Newsgroup: it.comp.lang.visual-basic
Titolo: Ancora DAO e ADO e loro coesistenza

Vorrei, almeno per qualche tempo, far "convivere" DAO 3.51 con ADO 2.1 al
solo scopo di, con opportuni parametri, implementare l'uso di ADO senza
modificare l'applicativo che utilizza DAO.
Ho visto che fra i riferimenti posso far coesistere DAO e ADO e tutto
funziona aprendo un database e un recordset sia con DAO e con ADO.
Per mantenere l'applicativo cosě com'č e concentrando le modifiche su alcune
Subs/Functions dedicate alle aperture di database e recordset, dovrei perň
utilizzare lo stesso nome degli oggetti database/connection e recordset
perchč a tali nomi l'applicativo fa spesso riferimento, cioč dovrei poter
fare:
    Dim rs as Recordset
oppure, in funzione di certi parametri,
    Dim rs as New ADODB.Recordset
1) Come posso risolvere questo problema in modo da potermi sempre riferire
all'oggetto/recordset con nome "rs" aperto con DAO oppure con ADO?
2) Perchč se fra i riferimenti metto ADO 2.5 (msado25.TLB) invece che ADO
2.1 (msado15.DLL) non mi funziona piů l'apertura dello stesso recordset che
apro tranquillamente con ADO 2.1? Mi segnala "Tipo non corrispondente"
(Perchč quel .TLB?)
Le istruzioni che uso sono queste:
Dim connessione_ado as New ADODB.Connection
Dim rs_ado as New ADODB.Recordset
cs = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\DATABASE.MDB;USER
ID=;PASSWORD=;"
connessione_ado.open cs
rs_ado.Open "SELECT * FROM TABELLA", connessione_ado, adOpenKeyset,
adLockPessimistic
Grazie a tutti.


La sintassi corretta col provider JET OLEDB 4.0 e ADO 2.5 è  :
cs = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:\DATABASE.MDB;JET
OLEDB: DATABASE PASSWORD = lupo;"
oppure se usi i parametri della open  sull'oggetto connection :
cn.open connectionstring, UserId, Password, Options ( vedi documentazione
metodo open )
dove UserID e Password sono valori stringa.
Un consiglio, non richiesto ma a mio avviso utile :
evita ==> Dim cn as New ADODB.Connection e
                Dim rs as New ADODB.Recordset
e usa ==> Dim cn as ADODB.Connection e
                 Dim rs as ADODB.Recordset
e solo al momento in cui ne hai bisogno :
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
ciò velocizza l'applicazione ed è valido per qualsiasi altro oggetto COM...
( almeno così dice Vaughn e il suo "il modo migliore di usare ADO"...)
Ciao
 Valter

 TLB==>TypeLibrary==>Libreria dei tipi
Non ho capito (scusa). Se fra i riferimenti ho MS ADO 2.5 (TLB) e lo includo
perchè non funziona? Perchè l'unico che posso usare è ADO 2.1 (DLL)?
Grazie in ogni caso.

 >
Ho fatto questo (sempre con DAO 3.51 e ADO 2.1):
1) Sulla Form creare due optionbutton con nome opt_dao (caption DAO) e
opt_ado (Caption ADO)
2) Sulla Form creare tre bottoni: btn_apri_db (Caption Apri DB), btn_apri_rs
(Caption Apri RS) e btn_chiudi (Caption Chiudi)
3) Inserire il seguente codice:
Dim stringa_connessione 'Solo per ADO
Dim nome_db             'Percorso e nome del database
Dim sql                 'Comando SQL
Dim db As Object        'Database (DAO) o Connessione al database (ADO)
Dim rs As Object        'Recordset
Private Sub Form_Load()
    nome_db = "Percorso e nome del database Access (mdb)"    '<<<Adeguare
    sql = "SELECT * FROM TABELLA"
'<<<Adeguare
    stringa_connessione = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" &
nome_db & ";USER ID=;PASSWORD=;"
    btn_apri_rs.Enabled = 0
    btn_chiudi.Enabled = 0
    opt_dao = 1
End Sub
Private Sub btn_apri_db_Click()
'       Apre il Database (DAO) o la Connessione allo stesso (ADO)
    Call apri_db(db)
    btn_apri_rs.Enabled = 1
    Beep
End Sub
Private Sub btn_apri_rs_Click()
'       Apre il Recordset
    Call apri_rs(db, rs)
'       Espone numero records
    rs.MoveLast
    MsgBox rs.RecordCount
    btn_chiudi.Enabled = 1
End Sub
Private Sub btn_chiudi_Click()
'       Chiude il Recordset
    rs.Close
    Set rs = Nothing
'       Chiude il Database (DAO) o la Connessione (ADO)
    db.Close
    Set db = Nothing
    btn_apri_rs.Enabled = 0
    btn_chiudi.Enabled = 0
End Sub
Function apri_db(db)
'       Apre su "db" il Database (DAO) o la Connessione allo stesso (ADO)
    If opt_ado Then
        Set db = New ADODB.Connection
        db.Open stringa_connessione
    Else
        Set db = OpenDatabase(nome_db)
    End If
End Function
Function apri_rs(db, rs)
'       Apre su "rs" il Recordset
    If opt_ado Then
        Set rs = New ADODB.Recordset
        rs.Open sql, db, adOpenKeyset, adLockPessimistic
    Else
        Set rs = db.OpenRecordset(sql)
    End If
End Function
-----------------------------
Adeguare le assegnazioni a "nome_db" e a "sql"
Avviare, attivare l'opzione desiderata (DAO o ADO) e cliccare sui bottoni
Apri DB, Apri RS e Chiudi.
Il tutto pare funzionare e ottengo i seguenti vantaggi:
1) Posso stabilire se l'intera procedura lavora in DAO oppure in ADO,
posizionando un solo parametro iniziale (in questo esempio opt_dao o
opt_ado)
2) L'oggetto "db" avrà in tutto il programma sempre lo stesso nome e potrà
indifferentemente essere un database (DAO) o una connessione (ADO)
3) L'oggetto "rs" ... come sopra
4) L'unico svantaggio (ma per i miei scopi, temporanei, lo accetto più che
volentieri) è che dovrò "duplicare" le istruzioni in tutti i casi in cui sia
prevista una sintassi (o metodi) diversa fra DAO e ADO. Concentrando però il
tutto (aperture di database e recordset e varie) in Subs/Functions dovrei
limitare gli interventi senza che il programma applicativo chiamante debba
subire troppe modifiche.
Ho scritto sciocchezze? Può funzionare? Grazie ancora.
PS: Ho provato anche con ADO 2.5 adeguando la stringa di connessione, ma si
verifica ancora un errore nell'apertura del recordset.

Un'altra cosa: Se inserisco DAO 3.6 al posto di DAO 3.51 e salvo eventuali
sintassi diverse, posso accedere a db Access 97 e 2000 indifferentemente,
vero? L'unico problema puň essere la creazione e la compattazione dei db che
verranno creati/trasformati in versione 2000 , giusto?


Ciao Lupo,
al tuo post precedente ( con le varie sub ), do un'occhiata più
approfondita stasera, mentre per quanto concerne questo ultimo post,
posso dirti che anche usando DAO 3.6, puoi ugualmente compattare
un db Access 97 e mantenerlo tale anche dopo la compattazione e lo
stesso vale per mdb Access 2000.
Per default la versione dell'mdb compattato è la stessa dell'mdb originale
in più puoi trasformare in fase di compattazione un mdb Access97 in un mdb
Access2000 con la seguente sintassi :
DBEngine.CompactDatabase "C:\MyPath\MydbOrig.mdb", "C:\MyPath\MydbNew.mdb",
, dbVersion40
La regola è che un mdb in fase di compattazione puo' essere trasformato in
un mdb
di una versione uguale o successiva, mentre non è disponibile l'opzione
inversa
ovvero p.e. trasformare un mdb Access2000 in un mdb Access97.
La stessa opzione, dbVersionXX, usata nel metodo CreateDatabase, ti consente
di creare un mdb
della versione che vuoi ( quasi sicuro, non testato a dir la verità, ma
l'opzione è presente tra
quelle possibili, quindi credo non ci siano problemi ).
Ciao
 valter

Grazie Valter, sei molto gentile.
In effetti ho fatto caso all'opzione della versione sulla CompactDatabase
solo dopo. Sai com'è, programmi scritti 3/4 anni fa e strutturati al punto
che chiamo solo le "mie" Subs/Functions e ... mi sono dimenticato della
sintassi "vera" che al loro interno usano. Grazie ancora.