title: Data Layer Abstract Factory
body: <p>I'm new on developing an Abstract Factory pattern, and would like to create an abstract factory in the data layer that will help me link this layer to any other databases for example sql and oracle. Can you help me on developing this task please. Note that the connection string of the database will be found in this layer not in the presentation..</p>
  
  <p>Thanks</p>
  
  <p>EDITED</p>
  
  <pre><code>public abstract class Database
  {
      public string connectionString;
  
      #region Abstract Functions
  
      public abstract IDbConnection CreateConnection();
      public abstract IDbCommand CreateCommand();
      public abstract IDbConnection CreateOpenConnection();
      public abstract IDbCommand CreateCommand(string commandText, IDbConnection connection);
      public abstract IDbCommand CreateStoredProcCommand(string procName, IDbConnection connection);
      public abstract IDataParameter CreateParameter(string parameterName, object parameterValue);
  
      #endregion
  }
  </code></pre>
  
  <hr>
  
  <pre><code>public class SQLDatabase : Database
  {
      public override IDbConnection CreateConnection()
      {
          return new SqlConnection(connectionString);
      }
  
      public override IDbCommand CreateCommand()
      {
          return new SqlCommand();
      }
  
      public override IDbConnection CreateOpenConnection()
      {
          SqlConnection connection = (SqlConnection)CreateConnection();
          connection.Open();
  
          return connection;
      }
  
      public override IDbCommand CreateCommand(string commandText, IDbConnection connection)
      {
          SqlCommand command = (SqlCommand)CreateCommand();
  
          command.CommandText = commandText;
          command.Connection = (SqlConnection)connection;
          command.CommandType = CommandType.Text;
  
          return command;
      }
  
      public override IDbCommand CreateStoredProcCommand(string procName, IDbConnection connection)
      {
          SqlCommand command = (SqlCommand)CreateCommand();
  
          command.CommandText = procName;
          command.Connection = (SqlConnection)connection;
          command.CommandType = CommandType.StoredProcedure;
  
          return command;
      }
  
      public override IDataParameter CreateParameter(string parameterName, object parameterValue)
      {
          return new SqlParameter(parameterName, parameterValue);
      }
  }
  </code></pre>
  
  <p>Those are the two classes I created..</p>