Listato 3. La classe "Manager": DatabaseManager.cs
namespace PeppeDotNet.it.DAL.AbstractFactoryPattern { public sealed class DatabaseManager : IDisposable { public DatabaseManager(Provider provider) { this.provider = provider; switch (provider) { case Provider.SQLServer: database = new SqlServer(); break; case Provider.Access: database = new Access(); break; default: break; } } private Provider provider; private IDbConnection connection; private IDataReader reader; private IDbCommand command; private Database database = null; public Provider Provider { get { return provider; } set { provider = value; } } public string ConnectionString { get { return ConnectionHelper.GetConnectionString(); } } public string ProviderName { get { return ConnectionHelper.GetProviderName(); } } public IDbConnection Connection { get { return connection; } } public IDataReader Reader { get { return reader; } } public void Open() { connection = database.CreateConnection(ConnectionString); if (connection.State != ConnectionState.Open) connection.Open(); command = database.CreateCommand(); } public IDataReader ExecuteReader(string query) { command = database.CreateCommand(query, Connection); reader = command.ExecuteReader(); return reader; } public DataSet ExecuteDataSet(string query) { command = database.CreateCommand(query, Connection); IDbDataAdapter adapter = database.CreateDataAdapter(); adapter.SelectCommand = command; DataSet ds = new DataSet(); adapter.Fill(ds); return ds; } public object ExecuteScalar(string query) { command = database.CreateCommand(query, Connection); object ritorno = command.ExecuteScalar(); return ritorno; } public int ExecuteNonQuery(CommandType commandType, string query) { command = database.CreateCommand(query, Connection); int ritorno = command.ExecuteNonQuery(); return ritorno; } public void CloseReader() { if (reader != null) reader.Close(); } public void Close() { if (connection.State != ConnectionState.Closed) connection.Close(); } public void Dispose() { CloseReader(); Close(); reader.Dispose(); command.Dispose(); connection.Dispose(); connection = null; command = null; } } }