Ciao a tutti,
sto provando a realizzare una classe factory per l'accesso ai differenti DBMS.
Ho un problema in merito alla definizione dell'oggetto inerente la connessione.
Il test che sto realizzando lo sto basando su Sql Server e Access.
Di seguito vi posto il codice:
Il problema è che nella classe DBConnection ho definito un oggetto Conn di tipo SqlConnection perché non riesco a trovare un altro oggetto che non sia legato al provider, quando vado invece a definire la classe derivata AccessConnection, ovviamente va in errore perché i due oggetti sono differenti (SqlConnection con OleDbConnection).codice:public enum TipoConnessione { SqlServer, Access, Oracle }; // Questa classe è una Factory quindi cerco di usare solo metodi statici public class DBConnectionFactory { // Il costruttore lo faccio privato in modo tale da non poter mai istanziare oggetti di questa classe. // La classe verrà chiamata solamente in modo statico. Voglio solo una connessione attiva per volta. private DBConnectionFactory() { } static DBConnection _conn; public static DBConnection Conn { get { if (_conn == null) { return null; } return _conn; } } // Il metodo statico connect deve chiamare il costruttore della classe derivata da DBConnection // a seconda del database al quale voglio collegarmi public static DBConnection connect(TipoConnessione tipoConn, bool trusted, string sName, string dbName, string uName, string pwd, bool isOdbc) { if (tipoConn == TipoConnessione.SqlServer) { SqlServerConnection sql = new SqlServerConnection(trusted, sName, dbName, uName, pwd, isOdbc); _conn = sql; return sql; } if (tipoConn == TipoConnessione.Access) { AccessConnection acc = new AccessConnection(); _conn = acc; return acc; } // Non abbiamo ancora definito una connessione Oracle ma ho la DLL per configurarla if (tipoConn == TipoConnessione.Oracle) { return null; } return null; } public static void close() { if (_conn == null) return; _conn.Close(); } } // Questa classe la faccio astratta in modo che la estendo in base al tipo di DBMS che mi ritrovo da sotto public abstract class DBConnection { protected SqlConnection Conn; } // Classe derivata da DBConnection x la connessione con SQL Server internal class SqlServerConnection : DBConnection { private bool trusted; private string sName; private string dbName; private string uName; private string pwd; private bool isOdbc; private string connString; internal SqlServerConnection(bool trusted, string sName, string dbName, string uName, string pwd, bool isOdbc) { this.trusted = trusted; this.sName = sName; this.dbName = dbName; this.pwd = pwd; this.isOdbc = isOdbc; this.uName = uName; buildConnString(); Conn = new SqlConnection(connString); try { Conn.Open(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } private void buildConnString() { if (isOdbc) { connString = (trusted) ? "Driver={SQL Server};Server=" + sName + ";Database=" + dbName + ";Trusted_Connection=Yes;" : "Driver={SQL Server};Server=" + sName + ";Database=" + dbName + ";Uid=" + uName + ";Pwd=" + pwd + ";"; } //OleDB else { connString = (trusted) ? "Data Source=" + sName + ";Initial Catalog=" + dbName + ";Integrated Security=SSPI;" : "Data Source=" + sName + ";Initial Catalog=" + dbName + ";User Id=" + uName + ";Password=" + pwd + ";"; } } } // Classe derivata da DBConnection x la connessione con Access internal class AccessConnection : DBConnection { private string connString; internal AccessConnection() { buildConnString(); Conn = new OleDbConnection(connString); try { Conn.Open(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } private void buildConnString() { connString = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=" + "c:\\prova.mdb;User Id=admin;Password=;"; } }
Avete per caso una soluzione a questo problema???
Grazie in anticipo.

Rispondi quotando