Newsgroup: it.comp.lang.visual-basic
Titolo: Separare l'accesso ai dati dalla logica applicativa del software

Ciao a tutti,
spero mi possiate aiutare a risolvere nel modo piu' elegante questo
problemino in VB.
Sto realizzando un applicativo client-server in VB6 Enterprise che utilizza
una base di dati su di un server per immagazzinare i dati.
Il programma, a partire dai dati presenti nella base di dati farà delle
analisi, immagazzinando successivamente i risultati ancora nella stessa base
di dati.
In un primo tempo la base di dati sarà realizzata in MySQL.
Tuttavia vorrei separare nel modo +elegante possibile la logica applicativa
(la parte computazionale del mio modello di calcolo) e l'interfaccia utente
dalla parte che gestisce la lettura e la scrittura dei dati sulla base di
dati remota, in modo tale da consentire un cambio di database (passando a
SQL Server, o Oracle) successivamente nel modo piu' indolore possibile.
Ora, io pensavo di mettere tutto il codice necessario alla
connessione/disconnesione al database e alla crezione dei recordset in un
modulo a parte, eventualmente in una classe.
Un esempio: se nella mia applicazione devo gestire (operare dei calcoli) un
recordset contenente i dati di una tabella del database creare una procedura
nella parte applicativa che non fa altro che richiamare una procedura della
mia classe per la gestione dei dati che mi crea il recordset e me lo
restituisce come oggetto da utilizzarsi (utilizzando quindi la sintassi sql
appropriata per lo specifico database in uso).
In questo modo io utilizzo il recordset senza sapere come è stato creato,
etc.
Voi che ne dite? Spero di essermi spiegato bene.....
Mi piacerebbe molto sapere come operate in questi casi.
Vi ringrazio anticipatamente per tutto il supporto!!
Ciaoo

> Mi piacerebbe molto sapere come operate in questi casi.
Io faccio esattamente come dici tu:
All'avvio dell'applicativo, creo una collection di oggetti, creati come
istanze di una classe "Server Remoto", che ha come proprietā accessibili
degli oggetti di tipo Adodb.Connection, Recordset, Command, ecc, e a cui
passo i parametri di connessione.
Quando devo operare sui dati, uso dei metodi tipo Apri_Connessione,
Chiudi_Connessione, Apri_Recordset, Verifica_Stato, Esegui_Comando, ecc...,
che ho creato con la pių alta protezione contro gli errori, con tutti i
check di stato della connessione ecc...
Ad esempio, se ho bisogno di un recordset da una tabella su un certo Server,
eseguo:
Ritorno=Server_Remoti.Item(12).Apri_Recordset("Select * from tabella
where...")
e in Ritorno ottengo il numero di record individuati, oppure un valore
negativo che mi dice che č avvenuto un certo errore. Se la connessione era
chiusa, o non utilizzabile per qualche problema, il metodo appena chiamato
aveva provato a riaprirla, ripassando tutti i parametri di sicurezza, , e se
proprio non ci era riuscito restituisce un valore negativo, da cui capisco
l'errore avvenuto.
Ciao
Alberto

Grazie mille Alberto per il tuo post.
Non ho capito solo una cosa: nel caso tu devi cambiare database (es. io
passo da MySQL a Oracle) sostituisci interamente la classe all'interno del
tuo programma e quindi hai una classe diversa per ogni database, oppure hai,
come credo, una classe unica e i parametri per accedere ai vari database
(Oracle, SQLServer, MySQL) sono codificati negli attributi degli oggetti
instanziati a partire da una unica classe che rimane invariata?
Spero di averti spiegato mio dubbio.
Grazie mille per la delucidazione!!


Voto per la seconda.
Tieni presente che _il grosso_ del codice Ado non varia al variare
del database.
Qualcosina sul comportamento dei corsori e del dialetto Sql sì,
ma è generalmente parametrizzabile.
ciao
ugo

 ma č generalmente parametrizzabile.
Esatto.
Infatti ho tutta una serie di parametri Optional, che ad esempio decidono
come formattare le date e i booleani (sono le differenze principali che ho
riscontrato fra i diversi DBMS).
Tieni presente che io opero generalmente con numerosi DB connessi
simultaneamente ad ogni applicativo, per cui per me č fondamentale avere la
collection degli oggetti "Server Remoto", per accedere.
In alcuni casi, addirittura, creo una classe che contiene al suo interno uno
(o una collection di) "Server Remoto":
Ad esempio, se mi devo collegare a 3 server con i dati, che so, di
magazzini, creo una collection Magazzini, in cui inserisco i 3 "Server
Remoto", oppure creo una classe "Archivio Magazzino", al cui interno
gestisco la collection dei singoli "Server Remoto" relativi ai magazzini. In
questo modo, posso avere un metodo del tipo "Totalizza Giacenze", che accede
a tutti i magazzini, e mi restituisce il totale delle giacenze, ovunque esse
siano (non mi occupo piů, quindi, di dove siano i server, che possono essere
anche di tipo diverso fra loro: Access, Sql, MySql, Oracle, ecc..).
Ciao
Alberto

Grazie mille per le delucidazioni e le dritte iniziali: credo che mi muoverņ
anche io in questo senso.
Grazie ancora!!