public static DbCommand createCommand(String cmmdText, CommandType cmmdType, List<DbParameter> listParameter, ConnectionDB.TypeDB TpDB)
        {
            try
            {
                ConnectionDB.TipoDB = TpDB;
                ConnectionDB.Build();
                DbProviderFactory factory = DbProviderFactories.GetFactory(ConnectionDB.ProviderName);
                DbConnection conn = factory.CreateConnection();
                conn.ConnectionString = ConnectionDB.ConnectionString;
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = cmmdText;
                cmd.CommandType = cmmdType;

                if (listParameter != null)
                {
                    foreach (DbParameter param in listParameter)
                    {
                        // Adicionando o parâmetro
                        cmd.Parameters.Add(param);
                    }
                }
                // Retorna o comando criado
                return cmd;
            }
            catch (DbException ex)
            {
                throw ex;
            }
        }
        /// String SQL ou StoredProcedure
        /// Tipo de Commando (Text ou Stored Procedure
        /// Lista de parâmetros
        /// Comando a ser executado (ExecuteNonQuery, ExecuteReader, ExecuteScalar, ExecuteDataTable)
        /// Object
        public static Object executeCommand(String cmmdText, CommandType cmmdType, List<DbParameter> listParameter, TypeCommand typeCmmd, ConnectionDB.TypeDB TpDB)
        {
            // Cria comando com os dados passado por parâmetro
            DbCommand command = createCommand(cmmdText, cmmdType, listParameter, TpDB);

            // Cria objeto de retorno
            Object objRetorno = null;

            try
            {
                // Abre a Conexão com o banco de dados
                command.Connection.Open();

                switch (typeCmmd)
                {
                    case TypeCommand.ExecuteNonQuery:
                        // Retorna o número de linhas afetadas
                        objRetorno = command.ExecuteNonQuery();
                        break;
                    case TypeCommand.ExecuteReader:
                        // Retorna um DbDataReader
                        objRetorno = command.ExecuteReader(CommandBehavior.CloseConnection);
                        break;
                    case TypeCommand.ExecuteScalar:
                        // Retorna um objeto
                        objRetorno = command.ExecuteScalar();
                        break;
                    case TypeCommand.ExecuteDataTable:
                        // Cria uma tabela
                        DataTable table = new DataTable();
                        // Executa o comando e salva os dados na tabela
                        using (DbDataReader reader = command.ExecuteReader())
                        {
                            table.Load(reader);
                        }
                        // Retorna a tabela
                        objRetorno = table;

                        break;
                }
            }
            catch (Exception ex)
            {
                 throw ex;
            }
            finally
            {
                if (typeCmmd != TypeCommand.ExecuteReader)
                {
                    // Sempre fecha a conexão com o BD
                    command.Connection.Close();
                    command.Connection.Dispose();
                    command.Dispose();
                    command = null;
                }
            }
            return objRetorno;
        }
        public static DbParameter createParameter(String nameParameter, DbType typeParameter, Object valueParameter, ConnectionDB.TypeDB TpDB)
        {
            // Cria um novo factories de acordo com o nome do provedor
            ConnectionDB.TipoDB = TpDB;
            ConnectionDB.Build();
            DbProviderFactory factory = DbProviderFactories.GetFactory(ConnectionDB.ProviderName);

            // Cria o Parâmetro e add seu valores
            DbParameter param = factory.CreateParameter();
            param.ParameterName = nameParameter;
            param.DbType = typeParameter;
            param.Value = valueParameter;

            // Retorna o Parâmetro criado
            return param;
        }
 public static int executeNonQueryWithTransaction(String cmmdText, CommandType cmmdType, List<DbParameter> listParameter, TypeCommand typeCmmd, ConnectionDB.TypeDB TpDB)
 {
     using (TransactionScope ts = new TransactionScope())
     {
         int iRet = 0;
         DbCommand cmd = createCommand(cmmdText, cmmdType, listParameter, TpDB);
         try
         {
             cmd.Connection.Open();
             iRet = cmd.ExecuteNonQuery();
             ts.Complete();
             return iRet;
         }
         catch (DbException ex)
         {
             throw ex;
         }
         finally
         {
             cmd.Connection.Close();
             ts.Dispose();
         }
     }
 }