Creare connettore per database

Innanzitutto buongiorno a tutti, e soprattutto a quelli che risponderanno perch se rispondono non sono in ferie…

Ho necessit di connettermi a diversi database non ovviamente tutti assieme …
All’avvio dell’applicazione leggo un file xml con la configurazione dell’applicazione stessa;
Se il file di configurazione non esiste apro una finestra che mi permette di specificare quale database utilizzare,
su quale porta, indirizzo ip, password, nome utente, stringa di connessione, nome dell’istanza
alcuni di questi campi sono inibibiti in base al tipo di database selezionato;
i database che posso utilizzare sono : Mysql, Postgresql, Mssql, Oracle e volevo inserire anche ODBC ma ci devo ragionare prima sopra…
Detto questo una volta salvata la configurazione la carico, testo se la connessione andata a buon fine e carico la mia applicazione.
Ho creato una variabile globale per la connessione che mi servir poi per determinare come gestire le query ( non per tutti i tipi di db le query sono uguali )

A questo punto devo connettermi al db … ed ho pensato ad una cosa del genere
(Nota bene apro la connessione al database e la chiudo solo quando la devo utilizzare, non voglio una connessione persistente)

ecco a quello che ho pensato :

dim db as database
select case procedure.dbtype 
case 1 // mysql
    db = new MySQLCommunityServer
    db.Port = procedure.dbport
case 2 // postgresql
    db = new PostgreSQLDatabase
    db.Port = procedure.dbport
case 3 // mssql
    db = new MSSQLServerDatabase
case 4 // oracle
    db = new OracleDatabase
end select
db.databasename = procedure.dbname
db.host = procedure.dbhost
db.username = procedure.dbusername
db.password = procedure.dbpassword

if not db.connet() then 
    msgbox("Attenzione, Errore durante la connessione al database " + procedure.dbname + " Errore : " db.errormessage)
    exit sub // ( o exit function, oppure quit se sono sulla procedura main )
else
    if procedure.dbtype = 1 then 
       // alcune impostazioni per il database mysql ... 
    end if
    .... esecuzione delle query e di tutto il resto
end if

c’ un modo pi comodo di gestire la cosa ?
giusto quello che st facendo ?

Mi sembra corretto.

Forse un metodo migliore avere una classe “database” (nel senso che gestisce il funzionamento con il db) di base e tante sottoclassi relative al db particolare
In modo da poter editare pi facilmente le casistiche particolari (modificare un metodo in una sotto classe).

A questo il metodo che hai scritto lo puoi trasformare in un metodo di classe (shared) per creare la sottoclasse giusta tipo:
//Ovviamente non so la stuttura delle tue classi e propriet, interpreto liberamente
Sub setupDB(procedure) as databaseBase
select case procedure.dbtype
case procedure.dbtypes.Mysql
return new databaseMySql(procedure)

//gli altri case
end sub

Poi nel costruttore locale fai le impostazioni locali invece di avere un metodo chilometrico, e aggiungere nuove versioni diventa a questo punto triviale

PS ho usato un enumerazione per il tipo di db, meglio che doversi ricordare i codici e molto pi leggibile nel tempo!

Io ci avevo quasi rinunciato … mi sono detto va beh mi scelgo postgre e poi chi vuole un erp per mac si adatter al db che ho scelto io … POI POTA ( ALLA BERGAMASCA MANIERA ) arriva ANTONIO e tutto sistemato…

GRAAAAAAZIEEEE MILLE

Stavo creando anche io una cosa del genere… interessante la tua soluzione :wink:

Posto la soluzione, io ho utilizzato una classe…

Classe DB KOALA

Per l’utilizzo della classe :

dim db as new DBKoala(procedure.dbdatabasetype) db.DatabaseName = procedure.dbname db.Host = procedure.dbhost // vediamo per ODBC db.Port = procedure.dbport db.Username = procedure.dbusername db.Password = procedure.dbpassword

Ovviamente il costrutto DBKoala(nomedb) pu assumere :

  • “PostgreSQL”
  • “MySQL”
  • “MsSQL”
  • “Oracle”

Ovviamente se si intende cambiare il nome alla classe occorre rinominare l’oggetto DB quindi attenzione a tutti i vari comandi supportati :
Close, Commit, Connect, ConnectionString, Error, Errorcode, Errormessage, FieldSchema, InsertRecord, Prepare, RollBack, SQLExecute, SQLSelect, TableSchema