Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    1

    [C#] Classe Factory per multi DB

    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:
    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=;";
            }
        }
    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).

    Avete per caso una soluzione a questo problema???

    Grazie in anticipo.

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    l'unica è usare un Object e quando la restituisci usi un cast o un typeof per capire di che tipo è e lo ritorni di quel tipo..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.