Unico oggetto per connessione a più tipi di database con VB.NET 2005

lunedì 17 agosto 2009 - 06.48

ravalon Profilo | Expert

Salve, ho un mio progetto creato inizialmente per MS Access che ora vorrei adattare per essere utilizzato anche con altri db, per il momento MySQL e PostgreSQL

Essendo stato creato inizialmente per un solo db (Access) avevo utilizzato un oggetto di tipo oledb.oledbconnection dichiarato in un modulo in modo che fosse visibile a tutto il progetto...tramite questo oggetti oledbconnection richiamavo la connessione al bisogno...

Stessa cosa per un oggetto oledb.oldbdatareader col quale raccoglievo i dati continuamente...

In questo modo usando due soli oggetti soddisfacevo il mio bisogno di connettermi e reperire dati con 2 soli oggetti che viveano praticamente per tutta la vita del programma anzichè dichiararne continuamente uno nuovo per poi distruggerlo..

Ora, se voglio connettermi ad un altro DB, per esempio MySQL, devo usare degli oggetti diversi....MySQL ha un suo provider .NET per cui non posso più usare l'oledb....

La mia domanda è....come posso creare un oggetto unico che, a seconda di una variabile che mi specifica il tipo di db utilizzato, mi faccia da oggetto connessione da richiamare sempre ? E' possibile secondo voi ?

Grazie

luigidibiasi Profilo | Guru

Se non hai grandi vincoli di velocità potresti usare Microsoft ODBC senza scrivere nessun oggetto.

Se invece,vuoi crearti la classe compatibile con tutti i DB mi viene in mente una cosa del tipo :

class data_layer
costruttore new ( string tipo_db )

Tale classe dovrebbe avere referenziate all'interno le dll ai provider che vuoi rendere compatibili.... poi dovresti progettare un meccanismo che ti restituisca sempre lo stesso oggetto (per rappresentare i dati ricevuti in memoria, tipo il dataset o datatable) per qualsiasi provider usato per effettuare query...

la classe sqlClient per Microsoft SQL ti permette di recuperare l'oggetto sqlDataReader.. Non conosco le dll per MySQL ma immagino che il tutto sia fattibile.

Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

ravalon Profilo | Expert

Ciao e grazie per la risposta...

Per la classe sarebbe un'ottima idea, solo che poi per l'estrazioni di dati usavo un datareader come detto che però sfruttava oledb...

ora...modificare/creare una classe per ottenere la connessione diversa per ogni provider non sarebbe impossibile e una volta fatto sarebbe perfetto...però mi potresti fare un esempio dell'implementazione ? Perchè quello che mi serve è un oggetto XXXConnection (oledb o MySQL) dichiarato nel modulo generale che possa essere visibile sempre e comunque.....la dichiarazione dell'oggetto la devo fare dentro il NEW giusto ? però cosi non sarebbe valido per tutto il progetto ma solo dopo che la classe viene chiamata o sbaglio ?

Attualmente ho una classe senza costruttore da dove richiamo l'unica connessione possibile cioè ad ACCESS...ecco il codice usato

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

il problema inoltre mi viene di più con le chiamate per le estrazioni dati dato che ce ne saranno un migliaio in tutto il programma...

anche li bisognerebbe che potessi fare la stessa cosa della classe per la connessione

ravalon Profilo | Expert

Aggiungo un cambiamento che ho provato a fare....

In base ad una variabile di tipo CHAR (attualmente usata come costante) capisco quale DB devo usare...

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Il mio problema è che DEVO usare l'oggetto CONNETTI di tipo Connection dichiarato come PUBBLICO quindi vorrei che CONNETTI diventasse OLEDBconnection quando uso ACCESS, MySQLConnection quando uso MySQL ecc.ecc.

Questo perchè richiamo tantissime volte la proprietà CONNETTI.STATE per capire se la connessione è ancora aperta o meno e uso questo oggetto per tutti i dati da estrarre (per questo ne ho dichiarato uno pubblico in modo da usare sempre e solo un oggetto di questo tipo)

Creando come ho fatto un oggetto specifico con la dichiarazione NEW e facendo il CAST da Connetti (connessione di tipo generico) a ConnettiMulti (connessione di tipo specifico) tramite il CTYPE mi pare che funzioni....non ho errori...., la connessione generica viene convertita in quella specifica e tutta va benone......
...voi che dite ?

Se secondo voi è accettabile, vi faccio l'ultima domanda...

Siccome è possibile che l'oggetto CONNETTI venga distrutto e che quindi non mi sia possibile controllare il valore di CONNETTI.STATE, come posso evitare che mi vada in errore ?

luigidibiasi Profilo | Guru


>Se secondo voi è accettabile, vi faccio l'ultima domanda...

>
>Siccome è possibile che l'oggetto CONNETTI venga distrutto e
>che quindi non mi sia possibile controllare il valore di CONNETTI.STATE,
>come posso evitare che mi vada in errore ?

if isnothing(connetti) then
' è stato distrutto
else
if connetti.isdisposed ( o qualcosa del genere)
' x il garbage
end if


Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

ravalon Profilo | Expert

Ok ti ringrazio !
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5